私が知っているように、たとえば「./program | grep someoutput」を実行すると、プログラムプロセスが終了した後にgrepされます。収入でどうやってそれを行うか知っていますか?
3 に答える
シェルは両方のプロセスを同時に生成し、最初の出力を 2 番目の入力に接続します。実行時間の長いプロセスが 2 つある場合は、プロセス テーブルに両方が表示されます。中間ステップはなく、最初のプログラムからのデータは保存されません。バケツではなくパイプです。
注 - バッファリングが含まれる場合があります。
実際、パイプを介して渡されたデータはバッファリングされないため、grep は「リアルタイムで」使用できますtail -f /var/log/messages | grep something
。
予期した出力が得られない場合は、前のコマンドが出力をバッファリングしている可能性が高くなります。たとえば、二重の grep を考えてみましょう:
tail -f /var/log/messages | grep something | grep another
stdout が端末に接続されていない場合、grep はその出力をバッファリングするため、出力はすぐには表示されません。つまり、バッファがフラッシュされるまで、2 番目の grep はデータを認識しません。ライン バッファリング モードを強制すると、この問題が解決します。
tail -f /var/log/messages | grep --line-buffered something | grep another
バッファリングの方法によっては、 stdbufを使用してコマンドのバッファリング モードを変更できる場合があります。
stdbuf -oL ./program | grep something
あなたが間違っている。
パイプはすぐにデータを受け取りますが、ソース プロセスによるパイプへの書き込みは、相手側 (シンク) が十分な速さでデータを読み取っていない場合、もちろんブロックされる可能性があります。
もちろん、これは必ずしもパイプが「ハードリアルタイム」の使用に適していることを意味するわけではありませんが、おそらくそれはあなたが意図したものではありません.