生成された子プロセスが失敗した場合は、すべての子プロセスを終了して終了します。

生成された子プロセスが失敗した場合は、すべての子プロセスを終了して終了します。

私のスクリプトでは、データセットをinput_aa、input_abなどに分割しました。その後、次のように同じPythonスクリプトで各データセットを実行しました。

# Execute program on each split file
for part in input_*; do
        python3 $part &
done
wait

私の質問は2つあります。 Pythonプロセスの失敗をどのように検出しますか?検出されたら、生成されたすべてのサブプロセスを終了し、失敗でスクリプトを終了するにはどうすればよいですか?

ベストアンサー1

プロセスグループを使用できます。

set -m
(
   for part in input_*; do
     (python3 "$part" || kill 0) &
   done
   wait
)

set -m(およびオプションの POSIX シェル機能、必須 Unix シェル機能) 独自のプロセスグループでジョブを実行します。bash、、、yashではサブシェルがアクティブな操作であるため、外部プロセスとその中に作成されたすべてのプロセスzshは同じプロセスグループに配置されます。mkshset -m(...)

dash他のシェルベースのケースと同様に、ashこれはトップレベルのシェルプロセスにのみ適用されます。したがって、コードをサブシェルに入れないと、コードは機能します。

kshこれはAT&Tや以前のSysV/Bourneシェルではまったく機能しません。

kill 0現在のプロセスグループのすべてのメンバーにSIGTERMシグナルを送信します。

おすすめ記事