web-dev-qa-db-ja.com

Bashと(アンパサンド)演算子

Bashシェルで3つのコマンドを並行して実行しようとしています:

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

これに伴う問題は、first command失敗します。たとえば、終了コードは0waitが成功したためだと思います)。

望ましい動作は、コマンドの1つが失敗した場合、終了コードがゼロ以外になることです(理想的には、実行中の他のコマンドが停止します)。

どうすればこれを達成できますか?

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

16
Misha Moroshko

私が考えることができる最高のものは:

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

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

または

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

ただし、これでもプロセスのチェックの順序が強制されるため、3番目がすぐに失敗した場合、1番目と2番目が終了するまで気付かないでしょう。

8
Karoly Horvath

これはあなたのために働くかもしれません:

parallel -j3 --halt 2 <list_of_commands.txt

これにより、3つのコマンドが並行して実行されます。

実行中のジョブが失敗すると、残りの実行中のジョブが強制終了されて停止し、失敗したジョブの終了コードが返されます。

4
potong

&&の代わりに&を使用する必要があります。例えば:

first command && second command && third command && wait

ただし、後続のすべてのコマンドの実行は前のコマンドの終了コード0に依存するため、これはコマンドを並行して実行しません。

4
anubhava