パイプラインが閉じたときに早く終了する方法は?

パイプラインが閉じたときに早く終了する方法は?

私はbash関数で表現するには複雑すぎるプログラムを書くためにgolanを使います。プログラムは標準入力を1行ずつ読み取り、変更された出力を標準出力に書き込みます。

stdinメソッドですべての行を繰り返すときの問題は、早く終了しないことです。たとえば、次のコマンドは10行だけでなくすべての行を処理します。

cat largefile | custom-program | head -n 10

デフォルトのUnixアプリケーションをどのように早期にシャットダウンすることができ、カスタムスクリプトでも同じことを行うことができますか?

答え1

では、パイプのもう一方の端が閉じてから(終了時)、次に行が作成されるとyes | headSIGPIPE信号によって終了します。yeshead

存在する:

(seq 20; sleep 10; seq 10) | head

サブシェルとサブシェルは最初の20行をパイプに書き込み(パイプバッファに収まるため)、問題なく10秒間スリープモードに入ることができます。その間、headwillは死んでいますが、サブシェルがパイプにさらに行を書き込むときにのみ死にます。

戻ってからパイプに最初に書き込むのではなく、コマンドを返したhead直後に終了するには、次のようにします。headbash

{ head; kill "$!"; } < <(exec custom-program < large-file)

bashそのため、プロセス交換のpidが正確に保存されます$!。)

また、見ることができます一致するものを見つけた後、Grepはゆっくり終了しますか?より移植性の高いアプローチが欲しい照会出力を制限し、信号13を防止します。に適用されるものの場合find

あるいはその逆にこの回答run_under_watchに似た質問と回答(関数)プロセスが終了すると標準入力壊れたパイプになります。

関連情報