パイプラインコマンドはいつ停止しますか?

パイプラインコマンドはいつ停止しますか?

次のコマンドの効果を理解するのに問題があります。

yes | tee hello | head

私のラップトップでは、「hello」の行数は約36,000で、標準出力に表示されている10行よりはるかに多いです。

私の質問は次のとおりです

  • yes、より一般的には、パイプラインのコマンドはいつ停止しますか?

  • 上記の2つの数字が一致しないのはなぜですか?teeパイプラインの次のコマンドで行が1つずつ渡されないためですか?

ベストアンサー1

:> yes | strace tee output | head
[...]
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(3, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
read(0, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=5202, si_uid=1000} ---
+++ killed by SIGPIPE +++

からman 2 write

EPIPE
fd リードエンドが閉じたパイプまたはソケットに接続します。これが発生すると、書き込みプロセスもSIGPIPE信号を受信します。

したがって、プロセスは右から左に死にます。headそれ自体が終了し、tee終了後にパイプに最初に書き込む試みで終了します。死んだ後もhead同じことが起こります。yestee

teeバッファがいっぱいになるまでパイプに書き込むことができます。ただし、ファイルに任意の内容を書き込むことができます。私のバージョンはファイルteeに同じブロックを書いているようです。stdout

headカーネルの読み取りバッファは8Kです。すべてを読みますが、これはジョブなので最初の10行だけを印刷します。

おすすめ記事