
> 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
わ現在マシン上にいるユーザーに関する情報を表示します。およびそのプロセス
ユーザーのプロセスを表示するには、マシン上で実行されているすべてのプロセスを調べます。これを試してみましょう:
$ strace -o w.trace w | grep whatever
トレース内には次のような行が見つかります (Linux システムの場合)。
open("/proc/8286/cmdline", O_RDONLY) = 4
read(4, "grep\0whatever\0", 2047) = 14
これは、すべてのプロセス (および表示されていないその他のもの) のコマンド ラインをw
明示的に調べて確認することを示しています。これは、それと並行して実行される を見つけて、それが何であるかを確認します。パイプは、両方のプロセスを同時に開始すること以外、これとは何の関係もありません。ある意味では、grep 自体を確認するのと似ています。/proc
grep
strace
ps | 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