2012-02-13 13 views
12

(アンパサンド)演算子:バッシュ&Iは、bashシェルに並列に3つのコマンドを実行しようとしている

$ (first command) & (second command) & (third command) & wait 

これで問題がfirst commandが失敗した場合、例えば、終了コードが0であるということである(I 〜が成功したので、waitが成功したため)

コマンドのいずれかが失敗した場合、終了コードはゼロ以外の値になります(理想的には、実行中の他のコマンドは停止します)。

これをどのように達成できますか?

コマンドを並行して実行したいことに注意してください。

答えて

4

私は考えることができる最善のは、次のとおりです。

first & p1=$! 
second & p2=$! 
... 

wait $p1 && wait $p2 && .. 

または

wait $p1 || (kill $p2 $p3 && exit 1) 
... 

しかし、これはまだプロセスのチェックのための順序を強制し、3分の1がすぐに失敗したので、もしあなたが気付くことはありません1回目と2回目の終了まで。

4

&の代わりに&&を使用してください。例:

ただし、これ以降のすべてのコマンドの実行は、前のコマンドの終了コード0に依存するため、このコマンドはパラレルで実行されません。

+3

私はリターンコードの点ではうまくいくと思いますが、コマンドは並行して実行しません。 – jcollado

+0

合意し、私の答えにもメモを作った。しかし、コマンドが並行して実行されている場合、2番目のコマンドが実行されたときに前のコマンドが終了していないため、終了コードを確認できません。 – anubhava

+1

ここでの主な制約は、コマンド**を並列に実行することです**。コマンドが並行して実行され、失敗の場合には終了コードがゼロでない限り、この1行をより複雑なbashスクリプトに置き換えることはできます。 –

2

これはあなたのために働くかもしれない:

parallel -j3 --halt 2 <list_of_commands.txt 

これは、並列に3つのコマンドを実行します。

実行中のジョブが失敗した場合は、実行中の残りのジョブを強制終了して停止し、失敗したジョブの終了コードを返します。

+0

'parallel'ドキュメントへのポインタを提供できますか? –

+0

3つのコマンドを並列に実行しますが、OPの終了コード要件を満たしません。 – anubhava

+0

@MishaMoroshko google gnu parallel。 @anubhavaを並列マニュアルから '--halt 2すべてのジョブを直ちに終了し、クリーンアップせずに終了します。終了ステータスは、失敗したジョブからの終了ステータスです。 – potong

関連する問題