“ w”与urandom有什么关系?


8
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
> 

为什么“ w”需要urandom?如何避免这种情况?

更新:

> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047)       = 14
> 

因此,过滤与urandom有关吗?

> strace who 2>&1 | grep urandom
> 

那为什么“谁”没有受到影响?


1
不是w哪个需要urandom。这是becase的Piped commands run concurrentlyunix.stackexchange.com/questions/37508/...
的Arkadiusz Drabczyk

@ArkadiuszDrabczyk很有道理。无法urandom访问w 源代码。
Rui F Ribeiro

2
您正在管道中看到第二个命令your grep和your awk。它没有w打开/dev/urandom设备文件。类似于ps -aux | grep grep
Kusalananda

1
@RuiFRibeiro:是的,我也检查了一下以确保。我认为这个问题现在可以标记为重复。
Arkadiusz Drabczyk

1
您可以问有关独角兽的问题:strace w 2>&1 | grep unicorns;-)
Digital Trauma

Answers:


8

如其他答案和评论中所述,观察到的原因是Bash处理管道的方式。为了过滤类似情况下的实际需求,您可以尝试将grep参数的第一个字母括起来,[]如下所示:

$ strace w 2>&1 | grep random
read(4, "grep\0random\0", 2047)         = 12
$ strace w 2>&1 | grep '[r]andom'
$ strace w 2>&1 | grep '[c]lose'
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
(...)

编辑:

正如R.下面评论中正确指出的那样,实际上strace看不到管道的另一侧。与它的输出类似,ps aux | grep grep 它也在目录中遍历 并在其中查找进程。grep grepw/procgrep


2
很高兴看到其他人使用ps / strace等执行此操作(尽管我通常将最后一个字母括起来),这是防止其找到自己的命令行的最简单方法。
蒙迪·哈德

这个技巧似乎已广为人知。我听说它在某些常见问题解答中列出,并且在Stack Exchange上已多次提及。
斯科特,

1
这个答案以及对问题本身的评论说的大致相同,完全是错误的。另一个答案(ilkkachu)是对的。strace不能(也不能以任何简单的方式)跟踪外壳程序管道中的其他命令。而是w在终端(和其他终端)上查找当前正在执行的命令,并在grep上运行作为其工作的一部分。
R .. GitHub停止帮助ICE

正确,谢谢,我更新了答案。
Arkadiusz Drabczyk

15

从联机帮助页w(1)

w显示有关计算机上当前用户的信息以及他们的进程

为了显示用户的进程,它会遍历计算机上运行的所有进程。让我们尝试一下:

$ strace -o w.trace w | grep whatever

在跟踪中,我们可以找到以下行(在Linux系统上):

open("/proc/8286/cmdline", O_RDONLY)    = 4
read(4, "grep\0whatever\0", 2047)       = 14

其中w明确显示了浏览/proc和查看所有进程的命令行(以及其他未显示的内容)。它找到grep与之平行运行的,这就是strace它的作用。该管道与它无关,除了可以同时启动两个进程。在某种程度上,它类似于ps | grep查看grep本身。

who 并且大多数其他命令不需要有关进程的信息,也不需要查找,因此在跟踪它们时不会看到相同的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.