いくつかの同時コマンドの後にbashコマンドを実行しますか?


13

いくつかのコマンドを並行して実行したい。これらのコマンドがすべて終了したら、次のコマンドを開始します。私は次のアプローチがうまくいくと思いますが

#!/bin/bash
command1 &
command2 &
command3 &&
command4

しかし、そうではなかった。command4最初の3つのコマンドすべてが完全に終了したときに実行する必要があります。

回答:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (引数なし)は、すべてのバックグラウンドプロセスが終了するまで待機します。

マニュアルwait内の完全なbash説明:

wait [-n] [n ...]

指定された各子プロセスを待機し、その終了ステータスを返します。それぞれnは、プロセスIDまたはジョブ仕様です。ジョブ仕様が指定されている場合、そのジョブのパイプライン内のすべてのプロセスが待機されます。 が指定されていない場合n、現在アクティブなすべての子プロセスが待機され、戻りステータスはゼロになります。-nオプションが指定されている 場合、 waitジョブが終了するまで待機し、終了ステータスを返します。n存在しないプロセスまたはジョブを指定する場合、戻りステータスは127です。それ以外の場合、戻りステータスは最後に待機したプロセスまたはジョブの終了ステータスです。


1
別のオプションは、のようなものを使用して各子のPIDを保存し、PID1=$!でそれらすべてを待つことですwait "$PID1" "$PID2" "$PID3"。これは少し複雑ですが、プロセスに待機したくない他の子がある場合は機能します。
カスペルド

1
@kasperdその場合の配列のほうが良い:cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"または似たようなもの。
クサラナナンダ

@kasperd「より良い」とは、「1つの変数のみを使用する」という意味です。多数を使用することに本質的に問題はなく、このような小さな場合にはおそらくまったく問題ありません。
クサラナナンダ

0

私はwait答えが好きですが、学術的な演習として、これもうまくいくと思います:

bash -c 'command1 & command2 & command3 &' && command4

私が間違っている場合は修正してください。


2
これをテストしましたか?絶対に機能しません。例:time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo bashコマンドに5秒かかったと言わない場合、望みどおりの動作をしませんでした。
セスロバートソン

私はそれを睡眠とエコーでテストしましたが、うまくいったようです。あなたの例は別の方法で証明します。
バーガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.