LaravelやVue.js、Ruby on Railsなどのサービス(アプリケーション)を起動するときに、コマンドの末尾に「&」をつけて実行することがあります。
例えば以下のようなコマンドです。
$ php artisan serve &
$ npm run serve &
$ rails s &
ここでは、コマンドの一番後ろについている「&」の意味について解説しています。
この「&」を理解する上で欠かせないフォアグランドとバックグラウンド、また、バックグラウンドで起動したサーバーやプロセスの終了方法についてもまとめています。
コマンド末尾の「&」とは何か?
結論から言うと、コマンド末尾の「&」とは、指定したコマンドをバックグラウンドで実行する処理になります。
バックグラウンドとは何か?
コマンドなどを入力して、実行しているプロセス(処理)をジョブといいます。
通常これらのプロセスはターミナル(黒画面)上で実行されるため、ジョブが終わるまでターミナルで入力することができません。
ジョブを裏側で処理し、ターミナル(黒画面)にコマンドを入力できる状態にしておくことができます。
この裏側でジョブを実行する場所をバックグラウンドといます。
逆に通常のジョブを実行する場所をフォアグラウンドといいます。
なおバック(back)は後ろで、フォア(fore)は前という意味です。
フォアグラウンドの処理
フォアグラウンドは通常のコマンドを実行する処理のことです。
例えば、フォアグラウンドでサーバーを立ち上げると、サーバーを停止するまで次のコマンドを入力できない状態になります。
フォアグラウンドの処理例
$ php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Fri Feb 5 19:07:33 2021] 127.0.0.1:63968 [200]: /robots.txt?1612519653143
[Fri Feb 5 19:07:33 2021] 127.0.0.1:63965 [200]: /favicon.ico
「ctrl + c」でサービスを終了するまで、次のコマンドを受け付けません。
バックグラウンドの処理
コマンドの末尾に「&
」をつけて実行すれば、そのコマンドをバックグラウンドで実行します。
例えば、先ほどと同様にサーバーを起動したとしても「&」があると、サーバーが起動した後もコマンドを入力することができます。
$ php artisan serve &
[1] 40411
$ Starting Laravel development server: http://127.0.0.1:8000
$
コマンド末尾に「&」つけるメリット(目的)
通常「php artisan serve」や「npm run serve」「rails s」といったコマンドを実行すると、以下のようにサーバーが起動した画面が表示され、コマンドを入力することができなくなります。
App running at:
- Local: http://localhost:8080/
- Network: http://192.168.11.5:8080/
サーバーが起動中に他のコマンドを実行したい場合は、サーバーを終了するか、他のターミナル(黒画面)を立ち上げる必要があります。
これは結構面倒です。
コマンドの末尾に「&」をつけてバックグラウンドでサービスを起動すると、サービスを起動しながらもコマンドを入力することができるようになります。
ジョブ番号とプロセスID
コマンド末尾に「&」をつけてバックグラウンドで処理を実行した場合、ジョブの番号とプロセスIDが表示されます。
[ジョブ番号] プロセスID
これが、バックグラウンドで起動したプロセスを終了する際には非常に重要になります。
実例
例えば以下の例の場合、[1] 40411
が実行したジョブの内容です。
$ php artisan serve &
[1] 40411
$ Starting Laravel development server: http://127.0.0.1:8000
[1] 40411
ジョブ番号: 1
プロセスID: 40411
複数の処理をバックグラウンドで起動する
コマンド末尾に「&」をつけた処理を複数実行することで、バックグラウンドで処理を複数実行することができます。
例えば、指定した秒の間だけ処理を停止するsleepコマンドを使うとバックグラウンドで複数の処理の実行を確認するのが簡単です。
sleepコマンドの使い方
sleep <待機する秒数>
実例:バックグラウンドで複数処理を起動
$ php artisan serve &
[1] 40411
$ Starting Laravel development server: http://127.0.0.1:8000
$ sleep 30 &
[2] 40463
$ sleep 30 &
[3] 40464
$ sleep 30 &
[4] 40465
$ sleep 30 &
[5] 40466
$ sleep 30 &
[6] 40467
$ sleep 30 &
[7] 40468
ジョブ番号が1~7まで作成されたことがわかります。
バックグラウンドの状況を確認する(実行中の処理の一覧を表示)
現在バックグラウンドでどのような処理が行われているかを確認するにはjobsコマンドを使います。
$ jobs
各ジョブには、+, -, Running, Done, Stopped, Terminatedといった表記がされます。それぞれ次のような意味になっています。
項目 | 内容 |
---|---|
+ | 直近で実行中のジョブ |
– | 一つ前のジョブ |
Running | 実行中 |
Done | 済み |
Stopped | 一時停止中 |
Terminated | 強制終了 |
実例:バックグラウンドで複数処理を起動
$ jobs
[1] Running php artisan serve &
[2] Done sleep 30
[3] Done sleep 30
[4] Running sleep 30 &
[5] Running sleep 30 &
[6]- Running sleep 30 &
[7]+ Running sleep 30 &
例えば[2] Done sleep 30
であれば、ジョブ番号2で「sleep 30」コマンドを実行し、それは既に完了(Done)していることを表しています。
コマンドの後ろに「&」がついていないのは、処理が完了したので、バックグラウンドではもはや実行していないという意味です。
[6]- Running sleep 30 &
は、ジョブ番号6で実行したコマンド「sleep 30 &」が今実行中のコマンドの一つ前に実行したもので、処理は現在進行中である(Running)ことを表しています。
バックグラウンドで実行中の処理を停止する方法
バックグラウンドで実行中の処理は、通常の「ctrl + c」 で停止することができません。
バックグラウンドで実行中の処理を停止する方法は以下の2つです。
プロセスをフォアグラウンドに移してから「ctrl + c」を実行する。
バックグラウンドで実行中の処理を停止する方法の1つ目は「プロセスをフォアグラウンドに移してから「ctrl + c」を実行する」方法です。
プロセスをフォアグラウンドに移す方法
プロセスをフォアグラウンド(通常の黒画面)に移すには以下のコマンドを実行します。
$ fg %[ジョブ番号]
fgはFore Ground(フォアグラウンド)の略です。
実例
例えば、「php artisan serve &」を実行して、バックグラウンドでLaravelのサーバーを起動したとします。
$ php artisan serve &
[1] 40411
$ Starting Laravel development server: http://127.0.0.1:8000
そのあとに「sleep」コマンドをバックグラウンドで実行し、複数のジョブを起動します。
「jobs」の状態は次のようになっているとします。
$ jobs
[1] Running php artisan serve &
[2] Done sleep 30
[3] Done sleep 30
[4] Running sleep 30 &
[5] Running sleep 30 &
[6]- Running sleep 30 &
[7]+ Running sleep 30 &
フォアグラウンドに移動したい「php artisan serve &」の処理はジョブ番号「1」であることがわかります。
これをフォアグラウンドに移動します。
$ fg %1
php artisan serve
これでジョブがフォアグラウンドに移動しました。
あとは「ctrl + c」を入力すれば処理を強制終了することができます。
フォアグラウンドに移動した処理をバックグラウンドに戻す
なお、ctrl + z
を押してから、bg %[ジョブ番号]
を実行すると、指定したジョブをバックグラウンドに移行できます。
実例
フォアグラウンドで処理を実行中に「ctrl + z」をクリック
^Z
[1]+ Stopped php artisan serve
[4] Done sleep 30
[5] Done sleep 30
[6] Done sleep 30
[7] Done sleep 30
実行中のプロセス一覧が表示されます。bg %1
でジョブ番号1をバックグラウンドに移動します。
$ bg %1
[1]+ php artisan serve &
$ 入力可能
ジョブをバックグラウンドに移動したことで、コマンドの入力が可能になりました。
killコマンドを使ってジョブを停止する
killコマンドを使うことでバックグラウンドで実行中の処理を停止することができます。
kill %ジョブ番号
実例
バックグラウンドで200秒間のスリープタイマーを起動します。
$ sleep 200 &
[1] 662
jobsで確認するとジョブは次のようになっています。
$ jobs
[1]+ Running sleep 200 &
このジョブ番号1の処理を停止します。
$ kill %1
[1]+ Terminated sleep 200
「Terminated」と表示され、強制終了したことがわかります。
「jobs」コマンドで状況を確認すると全てのジョブが消えています。
$ jobs
(補足)実行中の全ジョブの確認
現在の黒画面以外も含めて、PC環境の中のすべての実行中のジョブを確認するにはps
コマンドを実行します。
$ ps
psは「Process Status」の略です。
実例
$ ps
PID TTY TIME CMD
35922 ttys000 0:00.12 /bin/bash -l
40411 ttys000 0:00.46 php artisan serve
40415 ttys000 0:00.08 /usr/bin/php -S 127.0.0.1:8000 /Users/laravel/test-pj/server.php
40620 ttys000 0:00.00 sleep 30