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 $$
また、見ることができますすべてのサブプロセスを終了