私は、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.sh
とwriter_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
-9':問題はこれに
をパイプ中で作成されたサブシェルに関連するので、私は
writer_one.sh
でこれを変更し、reader_one.sh
ましたか? 'producer.sh'が正しく終了するまで、彼らは死んではいないようです。正確に何をしていますか? – damienfrancois'kill -9'を使うと、それらをまだ生き残らせることができます。彼ら(2人の読者と2人の作家)はパイプからのデータを待っています – tyranitar
'reader_one.sh'と' writer_one.sh'はサブシェルを作成しているようです。メインプロセスは殺しているが、サブプロセスは殺していない。 – Barmar