もしファイルがあったら
cmd1
cmd2
cmd3
そして、それらを互いに独立して実行し、終了ステータスを出力するかどうかに関係なく実行したいと考えています (つまり、終了を期待せず、失敗するかしないかに関係なくプロセスを開始し続けます)。;
次のコマンドが実行されることはわかっていますが、前のコマンドが失敗または成功するまで待機するため、そうではありません。すべてのコマンドを一度に開始したいと考えています。
これは、音楽を再生し、ベルを鳴らし、ブラウザを実行する、といったようなものですsleep 60m
が、明らかに、音楽が再生されてベルが鳴るまで待ってからブラウザを実行する方法はありません。一度に実行する必要があります。
追加: たとえば、
ファイルから行を読み取り、行ごとにターミナルを開いて実行しますか?
答え1
各行の末尾にアンパサンドを追加するだけで、すべてのコマンドがバックグラウンドにフォークされます。
cmd1 &
cmd2 &
cmd3 &
例
$ more at_once.bash
#!/bin/bash
echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep
このスクリプトを実行すると次のようになります。
$ ./at_once.bash
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10
3 番目のコマンドが 2 番目のコマンドの前にエコーされているため、タスクがバックグラウンドで実行されるため、順序どおりに実行されなかったことがわかります。これは、pgrep sleep
バックグラウンドで実行される 3 つのコマンドがすべて同時に実行されていることを示しています。
注記:この表記法は、単にコマンドがバックグラウンドで実行されていることを示すために使用しましたecho "X" && sleep 10
。この表記法はバックグラウンド自体とは関係ありません。末尾の部分はコマンドをバックグラウンドに&
「配置」するものですsleep 10
。
&
これを単一のコマンド ラインで実行したい場合は、区切り文字として使用することもできます。
$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733
このワンライナーをチェックします:
$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10
ここでも、すべてが同時に実行されていることがわかります。セミコロンを使用する場合は、次のようになります。
$ sleep 10 ; sleep 10 ; sleep 10
コマンドsleep 10
は、連続して実行されると完了するまでに 30 秒かかりますが、並列で実行されると完了するまでに 10 秒しかかかりません。