「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

相關內容