パイプが破損した場合、プロセスを終了できません。

パイプが破損した場合、プロセスを終了できません。

bashスクリプトでコマンドの実行を開始します(単純化のためにパラメータは省略されています)。

avconv | sox | nc

同じボックスで約150個のコマンドを同時に開始します。

最後のncコマンドはストリームを別のホストに送信します。その宿主が死んだらnc死んだのですが、avconvまだsox生きています。私がkillall soxこのような状況にあるとき、avconv私はまだ生きています。

一つくらいはあるはずですかsigpipe

bashスクリプトを手動で実行して終了するncと、他の2つのプロセスも終了します。しかし、そのようなスクリプトをたくさん起動するときはそうではありません。

sigpipeパイプバッファがいっぱいになったり、システムが高い競合状態にあるときにこれが機能しない可能性はありますか?この問題をどのように解決できますか?

答え1

以下は、ncが終了するとプロセスグループを終了します。

#!/bin/sh
avconv x y z | sox a b c | { nc somewhere port ; pkill -g 0 ; }

起動方法によっては、グループ内のエントリを制限するためにsetidなどのユーティリティを使用する必要があります。 ncが完了したら、シェルでpkillコマンドを実行してこれを実行することもできます-g 0-P $$

また、見ることができますすべてのサブプロセスを終了

関連情報