回答:
プロセスグループを使用できます。
set -m
(
for part in input_*; do
(python3 "$part" || kill 0) &
done
wait
)
set -m
(およびオプションのPOSIXシェル機能、必須のUnixシェル機能)は、独自のプロセスグループでジョブを実行します。ではbash
、yash
、zsh
、mksh
、それはサブシェルの仕事だset -m
外側のよう有効になってい(...)
て、その中に作成されたすべてのプロセスが同じプロセスグループに配置されます。
以下のためにdash
、その他のash
ベースのシェル、それは唯一のトップレベルのシェルプロセスで動作します。したがって、そのコードは、サブシェルに配置しない限り機能します。
これはAT&T ksh
や古いSysV / Bourneシェルではまったく機能しません。
kill 0
SIGTERMシグナルを現在のプロセスグループのすべてのメンバーに送信します。
bash
、dash
、yash
、。mksh
zsh
基本的にすべてのPOSIXシェルですが、AT&T kshです。set -m
POSIXで(過小に)指定されていますが、オプション機能です。
kill 0
親が何であれ、プロセスグループのすべてのメンバーを殺します。ps -j
プロセスグループIDを参照してください。
これは一例です。最初にこれを試して、必要なものを正確に入手してください。そのままでは壊れません。
#!/bin/bash
# Example of killing off all children
> killfile
> outfile.err
kill_em()
{
echo 'killing all children ' > 2
while read pid
do
kill -0 $pid && kill -9 $pid # if still running kill it
done < killfile
exit 1
}
export grandparentpid=$$
trap 'kill_em' 6
for i in 2 2 3 4 5 6 7 8 9 10
do
( sleep $i && ls oinkle >> outfile 2>> outfile.err &
pid=$!
echo $pid >> killfile
wait $!
[ $? -ne 0 ] && kill -6 $grandparentpid
) &
done
wait
これはls oinkle
(私のマシンでは)失敗するため、故意に失敗するように設定されています。
スタータースクリプトをいじった後に必要なものが得られたら、次のように変更します。
for i in 2 2 3 4 5 6 7 8 9 10
に:
for part in input_*
変化する:
sleep $i && ls oinkle
に:
python3 $part
リダイレクトはログを保存するためにあります。あなたはそれらを望まないかもしれません。
killfile
たジョブのすべてのPIDが含まれていない可能性があります。
[ $? -ne 0 ]
...