“ w”は、urandomで何をしますか?


8
> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
> 

なぜ「w」は不規則である必要があるのですか?これを回避するには?

更新:

> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047)       = 14
> 

ですから、urandomと関係があるのはフィルタリングですか?

> strace who 2>&1 | grep urandom
> 

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


1
それはw必要ではありませんurandom。それはbecaseですPiped commands run concurrentlyunix.stackexchange.com/questions/37508/...
はArkadiusz Drabczyk

@ArkadiuszDrabczyk理にかなっています。 ソースコードにはurandomアクセスできませんw
Rui F Ribeiro

2
パイプラインの2番目のコマンドであるyour grepとyourが表示されますawk。デバイスファイルをw開いていません/dev/urandom。それは似ていますps -aux | grep grep
クサラナンダ

1
@RuiFRibeiro:正解です。念のため確認しました。この質問は重複としてマークできるようになったと思います。
Arkadiusz Drabczyk 2017

1
ユニコーンに関する質問をすることができます:strace w 2>&1 | grep unicorns;-)
Digital Trauma

回答:


8

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


2
他の誰かがps / straceなどを使用してこれを実行しているのを見てうれしいです(通常は代わりに最後の文字を括弧で囲みます)。独自のコマンドラインを見つけないようにする最も簡単な方法です。
モンティハーダー

このトリックは広く知られるようになったようです。これはいくつかのFAQに記載されていると聞きましたが、ここStack Exchangeで何度も言及されています。
スコット

1
この答えと、ほぼ同じことを言っている質問自体へのコメントは、単に間違っています。(ilkkachuによる)他の答えは正しいです。straceシェルパイプライン内の他のコマンドを追跡しません(簡単な方法では追跡できません)。代わりに、w端末(および他の端末)で実行されている現在のコマンドを検索し、その作業の一部としてgrepを実行します。
R .. GitHub ICEのヘルプ停止

正解、thx、私は私の答えを更新しました。
Arkadiusz Drabczyk

15

マンページから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 そして、他のほとんどのコマンドはプロセスに関する情報を必要とせず、探しに行かないので、それらをトレースしても同じことはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.