次のようなbashスクリプトがあるとしましょう。
echo "x" &
echo "y" &
echo "z" &
.....
echo "Z" &
wait
サブシェル/サブプロセスの終了コードを収集する方法はありますか?これを行う方法を探していますが、何も見つかりません。このサブシェルを並列に実行する必要があります。そうでなければ簡単になります。
私は〜を探しています一般的な解決策(並列に実行される未知/動的数の子プロセスがあります)。
ベストアンサー1
使用wait
PIDを使用する場合する:
各プロセスIDで指定されたサブプロセスを待ちます。PIDまたは作業仕様作業仕様待っていた最後のコマンドの終了ステータスを終了して返します。
常に各プロセスのPIDを保存する必要があります。
echo "x" & X=$!
echo "y" & Y=$!
echo "z" & Z=$!
スクリプトでジョブ制御を有効にしてset -m
ジョブ仕様を使用することも%n
できますが、ほとんど望ましくありません。職業制御に他の多くの副作用がある。
wait
プロセスが完了したときと同じコードが返されます。wait $X
asを使用して、将来の(合理的な)時点で最終コードにアクセスしたり、$?
単にtrue / falseとして使用したりできます。
echo "x" & X=$!
echo "y" & Y=$!
...
wait $X
echo "job X returned $?"
wait
コマンドがまだ完了していない場合は、コマンドが完了するまで一時停止します。
このような低迷を避けたい場合は、trap
オンに設定SIGCHLD
、終了回数を計算し、すべてがwait
完了するとすぐにすべてのタスクを処理します。wait
ほぼ常に一人で使用できます。