ファイルがある場合
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
2 番目のコマンドの前に、3 番目のコマンドがエコーされ、バックグラウンド特性によりジョブが順番に実行されないことがわかります。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秒かかります。