バックグラウンドで同じコマンドを複数回実行する


14

複数のコマンドを実行し、bashを使用してそれらをバックグラウンドにするにはどうすればよいですか?

例えば:

$ for i in {1..10}; do wait file$i &; done

ここで、waitはカスタムバイナリです。

今、私はエラーを受け取ります:

syntax error near unexpected token `;'

上記のコマンドを実行するとき。

バックグラウンドになったら、コマンドを並行して実行する必要があります。


1
言及していないことを恥ずかしく思います:nohupバックグラウンドでコマンドを実行できるようにする
デイブハミルトン

3
エラーあなたがしているシーイングはによるものである&;の両方の「コマンド・ターミネータ」です。両方を使用する必要はありません:for ...; do wait $arg & done動作します。
グレンジャックマン

@glennジャックマン。はい、質問を投稿してから実際に試しました。両方の必要はありません。and&
セビー

3
将来の読者のために、ドキュメントへのリンク:「リストは、演算子「;」、「&」、「&&」、または「||」のいずれかで区切られた1つ以上のパイプラインのシーケンスであり、オプションで1つで終了します「;」、「&」、または改行。」(強調鉱山)
グレンジャックマン

回答:


21

&、同じように;あるリストターミネーター演算子。それらは同じ構文を持ち、交換可能に使用できます(目的に応じて)。この手段あなたが欲しい、または必要としないこと、command1 &; command2あなたが必要とするすべてですcommand1 & command2

したがって、あなたの例では、次のように書くことができます:

for i in {1..10}; do wait file$i & done

waitコマンドはバックグラウンドで起動され、ループはすぐに次のループに移動します。


4

互換性のために、展開の代わりにposix形式を使用します。

for i in $(seq 1 10); do (./wait file$i &); done

1
seqこれはPOSIXコマンドではなく、一般にGNUシステムでのみ見られることに注意してください。動作または$(...)(および$i)は、の現在の値に依存します$IFS。また、実行していることに注意してください(cmd &)cmdあなたは待つとインスタンスの終了ステータスを取得することができなくなりますので、サブシェルの子になります。
ステファンシャゼラス

2

コマンドをグループ化し、グループ化されたコマンドをバックグラウンドに配置できます。お気に入り :

$ for i in {1..10}; do ((wait file$i)&); done

内側の括弧を使用する必要は...ありません
マルク・

質問にあるように複数のコマンドをバックグラウンドに入れたい場合にのみ、内側の括弧を使用する必要があります。Like((sleep 1; wait file $ i)&);
マズ

2

あなたのバイナリは本当に名前が付けられていwaitますか?waitシェルが組み込まれているため、そうすることはお勧めしません。

bashは、バックグラウンドプロセスを起動する1行のループを適切に解析しないと思います。コードを次のように変更することをお勧めします。

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.