先日、phpからシェルコマンドを実行するソース内で、コマンドの最後に「&」が付いているのを見かけ、何だこの&は?と思ったので、シェルコマンドの最後に&(アンド)をつけると何が起こるのかを調べてみた。
バックグラウンドでプログラムを実行する(&アンド)
結論から言うと、コマンドの最後に&を付けて実行すると、バックグラウンドでプログラム(コマンド)が実行される。
長い処理や、複数の処理を並列に実行したい場合に便利な使い方となる。
実際に、筆者の場合も、phpソース内で、for文で繰り返しシェルコマンドを実行する際に&を付けていた。
- コマンドの最後に&を付けて実行すると、バックグラウンドでプログラム(コマンド)が実行される。
- 長い処理や、複数の処理を並列に実行したい場合に便利。
使い方
Command &
Command は、任意のプログラム(コマンド等)。
バックグラウンドでプログラムを実行してみる例
実際にバックグラウンドでプログラムを実行して挙動を確かめてみる。
挙動の確認に使用するプログラム(コマンド)は、sleepコマンドを使用する。sleepコマンドは、引数に指定した秒数分、次のプログラムの実行を待機するコマンドだ。待機している間は、フォアグラウンドでコマンドを実行することができない。
10秒待機、その間はフォアグラウンドでコマンドを実行できない
sleep 10
しかし、上記sleepコマンドの最後に&を付けて、sleepコマンドの実行をバックグラウンドにすることで、フォアグラウンドでは、新たにプログラムの実行を受け付けることが可能となる。
# sleep 10 &
[1] 500000
# ← 次のコマンドを受け付ける状態になっている
2個目、3個目と立て続けにプログラムを実行してみても同じ結果となる。
# sleep 10 &
[2] 50826
# sleep 10 &
[3] 50827
# ← 次のコマンドを受け付ける状態になっている
バックグラウンドのプログラムが終了した場合、エンターキーを押したタイミングでシェルが教えてくれる。
# sleepが終わった頃あいでエンターキーを押す
#
[1] Done sleep 10 ← プログラムの終了の通知
[2] Done sleep 10 ← プログラムの終了の通知
バックグラウンドで実行中のプログラムを確認する:jobsコマンド
バックグラウンドで実行中のプログラムは、「jobs」コマンドで確認できる。
# jobs
[3]- Running sleep 10 &
[4]+ Running sleep 10 &
参考
■sleep
https://www.atmarkit.co.jp/ait/articles/1611/21/news021.html