並列バックグラウンドプロセス(サブシェル)の終了コードの収集

並列バックグラウンドプロセス(サブシェル)の終了コードの収集

次のようなbashスクリプトがあるとしましょう。

echo "x" &
echo "y" &
echo "z" &
.....
echo "Z" &
wait

サブシェル/サブプロセスの終了コードを収集する方法はありますか?これを行う方法を探していますが、何も見つかりません。このサブシェルを並列に実行する必要があります。そうでなければ簡単になります。

私は〜を探しています一般的な解決策(並列に実行される未知/動的数の子プロセスがあります)。

ベストアンサー1

使用waitPIDを使用する場合する:

各プロセスIDで指定されたサブプロセスを待ちます。PIDまたは作業仕様作業仕様待っていた最後のコマンドの終了ステータスを終了して返します。

常に各プロセスのPIDを保存する必要があります。

echo "x" & X=$!
echo "y" & Y=$!
echo "z" & Z=$!

スクリプトでジョブ制御を有効にしてset -mジョブ仕様を使用することも%nできますが、ほとんど望ましくありません。職業制御に他の多くの副作用がある

waitプロセスが完了したときと同じコードが返されます。wait $Xasを使用して、将来の(合理的な)時点で最終コードにアクセスしたり、$?単にtrue / falseとして使用したりできます。

echo "x" & X=$!
echo "y" & Y=$!
...
wait $X
echo "job X returned $?"

waitコマンドがまだ完了していない場合は、コマンドが完了するまで一時停止します。

このような低迷を避けたい場合は、trapオンに設定SIGCHLD、終了回数を計算し、すべてがwait完了するとすぐにすべてのタスクを処理します。waitほぼ常に一人で使用できます。

おすすめ記事