> 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显示有关当前在机器上的用户及其进程的信息
为了显示用户的进程,它遍历机器上运行的所有进程。让我们试试这个:
$ 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
和大多数其他命令不需要有关进程的信息,也不要去看,所以在跟踪它们时你看不到相同的信息。
正如其他答案和评论中所解释的,您观察到的原因是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 grep
w
/proc
grep
归档时间: |
|
查看次数: |
1256 次 |
最近记录: |