> 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显示有关当前计算机上的用户的信息,以及他们的流程
为了显示用户的进程,它会遍历计算机上运行的所有进程。让我们试试这个:
$ 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 grep
w
/proc
grep