Random
“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 >
那為什麼“誰”不受影響呢?
正如其他答案和評論中所解釋的,您觀察到的原因是
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
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
並且大多數其他命令不需要有關程序的資訊,也不需要查找,因此在跟踪它們時您看不到相同的資訊。