だからこれは質問そのものではなく、ただ私が気になってする質問です。私はDebianのフォークであるLinux Mint MATEを使用しています。私がするなら:
ps afx | grep abcdefg
私は得る:
16599 pts/3 S+ 0:00 | \_ grep --color=auto abcdefg
だからgrepのプロセスを示しています。しかしそれは後ろにパイプラインで:上記のコードが実行され、結果が得られ、それに渡すとps
思いました。それでは、実際に結果に現れるのはなぜですか?これからもそうなるのではないでしょうか?パイプが実際にどのような用途に使用されるかについての基本的な知識が不足しているようです。ps
grep
grep
ps
答え1
この質問は重複しており、unix.stackexchange.comに属しています。
要約すると、OpenGroupのシェルコマンド言語ドキュメントには、「に関する詳細は比較的あいまいです。管路":
パイプは、制御演算子「|」で区切られた1つ以上の命令シーケンスです。最後のコマンドを除くすべてのコマンドの標準出力は、次のコマンドの標準入力に接続する必要があります。
パイプの形式は次のとおりです。
[!] command1 [ | command2 ...]
コマンド1の標準出力は、コマンド2の標準入力に接続する必要があります。コマンドの標準入力、標準出力、またはその両方が、コマンドの一部としてリダイレクト演算子によって指定されたリダイレクトの前にパイプによって割り当てられているかのように処理する必要があります(リダイレクトを参照)。
パイプがバックグラウンドにない場合(非同期リストを参照)、シェルはパイプで指定された最後のコマンドが完了するまで待機し、可能であればすべてのコマンドが完了するまで待つ必要があります。
データがパイプラインから「左から右に」流れることは明らかですが、スケジュール自体は保証されません。
また見なさい:
答え2
スケジュールはあまり重要ではありません。 1時間の作業を配管することを考えると、パイプは最初のプログラムの開始から完了まで継続的に開いたままになります。 2番目のプログラムは、最初のプログラムとまったく同じ時間実行され、両方のプログラムは通常同時に完了します。
つまり、psは出力を取り、それからgrepに送られません。両方とも同時に実行され、1つの出力が2番目の出力に供給されます。リアルタイム。最初のプログラムが完了するのを待つのではなく、1時間分のデータを収集して一度に2番目のプログラムに送信します。
実際にはある程度のバッファリング(数百文字)がありますが、特に複数のパイプが関わる場合にはさらにそうです。しかし、ほとんどの場合、同時に実行され、互いに直接通信することが可能です。
答え3
ここにはある程度タイミングが関係していると思います。
mkfifo /tmp/pipe
echo >/tmp/pipe
(シェルプロセスが一時停止します)
どちらが最初に始まるかは問題ではありません。なぜなら、読者がその終わりを開くまで、著者はとにかくブロックするからです。したがって、ほとんどすべての一般的なUnixプログラムは他のタスクを実行する前にi / oを初期化し、プロセスが少なくともパイプの読み取り側で開くことができるほど十分に確立されるps
まで停止します。grep
cat </tmp/pipe &
echo >/tmp/pipe
(今回は止まりません)
grep
この順序は、常にそこに到達することを意味します。
しかし、他の方法もあります。
たとえば、GNU実行プロセスのargv0を探している場合は、ps
次のようにします。
ps -C argv0
を使用する場合はgrep
これは完全に可能ですが、再度argv0を検索してください。
ps -eocomm= -opid=| grep ^argv0
...各コマンドの引数を除外します。
そしてもちろん:
pgrep argv0