2016-03-18 14 views
2

他のスクリプトを並列実行するためのbashスクリプトがあります。 waitコマンドを使用すると、すべての並列処理が完了するまで待つことができます。しかし、バックグラウンドで並列に実行されたすべてのプロセスが正常に実行されたかどうかを知りたい(戻りコード0)。あなたが終了し、次のジョブの終了コードを返しますwait -nを使用することができますbashでの並列実行結果の取得

--calling multiple processes to execute in backgroud 
process-1 & 
process-2 & 
process-3 & 
wait 
--after parallel execution finishes I want to know if all of them were successful and returned '0' 
+1

[シェル - バックグラウンドプロセスの終了コードを取得する]の可能な複製(http://stackoverflow.com/questions/1570262/shell-get-exit-code-of-background-process) – dfogni

答えて

1

:よう

私のコードが見えます。バックグラウンドプロセスごとに1回呼び出します。

process-1 & 
process-2 & 
process-3 & 
wait -n && wait -n && wait -n 
+0

My Bash 4.2.37には'wait -n'はありません。 manページの 'wait '( 'wait [n ...]')を意味しましたか? –

+0

はい。 – nishant

+0

'' 'wait [-n]' 'のものはここにあります:https://www.gnu.org/software/bash/manual/bashref.html – dekkard

0

待機-nは正解だが、それはbashの4.2.37に存在していないので、あなたはこのトリックを試すことができます。

#!/bin/bash  
(
    process-1 || echo $! failed & 
    process-2 || echo $! failed & 
    process-2 || echo $! failed & 
    wait 
) | grep -q failed 

if [ $? -eq 0 ]; then 
    echo at least one process failed 
else 
    echo all processes finished successfully 
fi 

念の文字列が返されない「失敗」します実際に成功している間にプロセス自体によって。あなたはprocess-1 &>/dev/null

0

で何を/ dev/nullにリダイレクトstdinとstderrにプロセスを実行することができます。また、私は解決策を少し簡素化するツールを書いた:https://github.com/wagoodman/bashful

あなたが実行したいものを記述したファイルを提供しています。 ..

# awesome.yaml 

tasks: 
    - name: My awesome tasks 
    parallel-tasks: 
     - cmd: ./some-script-1.sh 
     - cmd: ./some-script-2.sh 
     - cmd: ./some-script-3.sh 
     - cmd: ./some-script-4.sh 

...などのようにそれを実行します。

bashful run awesome.yaml 

そして、それは垂直PRと並行して、あなたのタスクを実行します各タスクのステータスを示す出力バー。エラーは赤色で表示され、エラーが検出された場合(並列ブロックが完了した後に終了が発生した場合)、プログラムは1で終了します。

関連する問題