> 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
が実行することを確認します。パイプは、両方のプロセスを同時に開始すること以外、それとは関係ありません。ある意味では、grep自体を見るのはps | grep
に似ています。
who
および他のほとんどのコマンドは、プロセスに関する情報を必要とせず、探しに行かないので、それらをトレースしても同じことがわかりません。