web-dev-qa-db-ja.com

"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
> 

では、なぜ「誰」が影響を受けないのでしょうか。

8
Marina Ala

他の回答やコメントで説明されているように、あなたが観察する理由は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プロセスを見つけます。

8

マンページから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が実行することを確認します。パイプは、両方のプロセスを同時に開始すること以外、それとは関係ありません。ある意味では、grep自体を見るのはps | grepに似ています。

whoおよび他のほとんどのコマンドは、プロセスに関する情報を必要とせず、探しに行かないので、それらをトレースしても同じことがわかりません。

15
ilkkachu