“w”与 urandom 有什么关系?

“w”与 urandom 有什么关系?
> 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(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大多数其他命令不需要有关进程的信息,也不会去查找,因此在跟踪它们时您不会看到相同的信息。

答案2

正如其他答案和评论中所解释的,您观察到的原因是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

相关内容