
> 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