"w" 与 urandom 有什么关系?

Mar*_*Ala 8 random w

> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
> 
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

那么过滤与urandom有关吗?

> strace who 2>&1 | grep urandom
> 
Run Code Online (Sandbox Code Playgroud)

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

ilk*_*chu 15

从联机帮助页w(1)

w显示有关当前在机器上的用户及其进程的信息

为了显示用户的进程,它遍历机器上运行的所有进程。让我们试试这个:

$ strace -o w.trace w | grep whatever
Run Code Online (Sandbox Code Playgroud)

在跟踪中,我们找到了这样的行(在 Linux 系统上):

open("/proc/8286/cmdline", O_RDONLY)    = 4
read(4, "grep\0whatever\0", 2047)       = 14
Run Code Online (Sandbox Code Playgroud)

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

who 和大多数其他命令不需要有关进程的信息,也不要去看,所以在跟踪它们时你看不到相同的信息。


Ark*_*zyk 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
(...)
Run Code Online (Sandbox Code Playgroud)

编辑:

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

  • 很高兴看到其他人这样做(尽管我通常用 ps/strace 等将最后一个字母括起来)。防止它找到自己的命令行的最简单方法。 (2认同)