2016-10-24 15 views
2

私は、3種類のプロセス間で通信するために名前付きパイプを使用しています。プロデューサ、一部の読者、いくつかのライターです。次に、すべてのプロセスを実行するだけのスクリプトを作成しました。run.shプロセスが終了するか、すべての子プロセスが終了すると、そのプロセスも終了します。 run.shスクリプトは、次のとおりです。終了時にbashスクリプトのすべてのサブプロセスを強制終了するには?

#!/bin/bash 
MAX_WRITERS=2 
MAX_READERS=2 

trap 'jobs -p | xargs kill' EXIT 

./producer.sh & 
for ((i=1; i<=$MAX_READERS; i++)); do ./reader_one.sh & done 
for ((i=1; i<=$MAX_WRITERS; i++)); do ./writer_one.sh & done 
wait 

スクリプトは非常に簡単ですが、私はまだ(ちょうどproducer.shが殺害された)を実行しているいくつかのプロセスを見ることができるので、それが動作しないようです。

$ ./run.sh 
... some activities ... 
^C 
$ ps aux | grep "[b]ash ./" 
user   48909 ... /bin/bash ./writer_one.sh 
user   48906 ... /bin/bash ./writer_one.sh 
user   48904 ... /bin/bash ./reader_one.sh 
user   48901 ... /bin/bash ./reader_one.sh 

だから私は、これを殺さなければならない:

$ ps aux | grep "[b]ash ./" | awk '{print $2}' | xargs kill 

は、どのように私はそれが動作することができますか?

アップデート1: そう単純killは無用である、&でバックグラウンドでrunnedされたジョブが信号SIGINTに耐えることができると思われます。トラップ内のkill -9またはkill -TERMを使用すると、信号は受信されますが、有効なままになります。producer.shのみが正しく殺されました。

./run.sh: line 21: 50039 Killed: 9    ./producer.sh 
./run.sh: line 21: 50040 Killed: 9    ./reader_one.sh 
./run.sh: line 21: 50041 Killed: 9    ./reader_one.sh 
./run.sh: line 21: 50042 Killed: 9    ./writer_one.sh 
./run.sh: line 21: 50043 Killed: 9    ./writer_one.sh 

$ ps aux | grep "[b]ash ./" 
user   50069 ... /bin/bash ./writer_one.sh 
user   50068 ... /bin/bash ./writer_one.sh 
user   50064 ... /bin/bash ./reader_one.sh 
user   50061 ... /bin/bash ./reader_one.sh 

アップデート2: reader_one.shwriter_one.shはちょうど名前付きパイプ内のデータを待っています。

更新3: ここでコードはread_one.shです。おそらくその理由は、ちょうど@Barmarの提案が正しい道に私を取り上げwhile

init_read(){ 
... 
} 

read_one(){ 
... 
} 

init_reader 
while true; do 
    cat to_read | while read line; do 
    read_one $line; 
    done 
done 
+0

-9':問題はこれに

cat to_read | while read line; do read_one $line; done 

をパイプ中で作成されたサブシェルに関連するので、私はwriter_one.shでこれを変更し、reader_one.shましたか? 'producer.sh'が正しく終了するまで、彼らは死んではいないようです。正確に何をしていますか? – damienfrancois

+0

'kill -9'を使うと、それらをまだ生き残らせることができます。彼ら(2人の読者と2人の作家)はパイプからのデータを待っています – tyranitar

+3

'reader_one.sh'と' writer_one.sh'はサブシェルを作成しているようです。メインプロセスは殺しているが、サブプロセスは殺していない。 – Barmar

答えて

1

前にあるため、パイプのサブシェルです。彼らはまた殺す `抵抗ください

while read line; do 
    read_one $line; 
done < to_read 
関連する問題