LaravelのLaravel Mixなど、Node.jsのパッケージを使ったモジュールでファイルの変更を検知して自動コンパイルをする際に、「npm run watch 2>&1 &」といったコマンドが使われていることがあります。
「npm run watch」はわかるとして「2>&1」やファイル末尾の「&」は何だ?と思われる方も少なくありません。
ここでは「npm run watch 2>&1 &とは何か?について「2>&1」やファイル末尾の「&」の意味も含めて解説しています。
- npm run watch 2>&1 &とは何か?
- npm run watchとは何か?
- 2>&1とは何か?
- コマンド末尾の&は何か?
- npm run watch 2>&1 &のまとめ
- フォアグラウンドの処理
- バックグラウンドの処理
- コマンド末尾に「&」つけるメリット(目的)
- ジョブ番号とプロセスID
- 複数の処理をバックグラウンドで起動する
- バックグラウンドの状況を確認する(実行中の処理の一覧を表示)
- バックグラウンドで実行中の処理を停止する方法
- プロセスをフォアグラウンドに移してから「ctrl + c」を実行する。
- フォアグラウンドに移動した処理をバックグラウンドに戻す
- killコマンドを使ってジョブを停止する
- (補足)実行中の全ジョブの確認
npm run watch 2>&1 &とは何か?
「npm run watch 2>&1 &」とは何かを結論からいうと、「npm run watch」をバックグラウンドで実行して、エラーが発生した場合も通常の処理内容と合わせて出力するというコマンドです。
「npm run watch 2>&1 &」は以下の3つの要素に分解できます。
以下でそれぞれの処理が何をしているかについて解説します。
npm run watchとは何か?
「npm run watch」は、プロジェクトを監視状態(watch)にして、ファイルに変更があったときに自動でコンパイルを実行してくれるとても便利なコマンドです。
開発環境においては、ファイルを変更したらその変更内容をすぐにブラウザでも確認することが一般的なので「npm run watch」を実行しておきます。
2>&1とは何か?
「2>&1」とは、発生したエラーと通常の出力の両方ともをターミナル(黒画面)に出力する指示です。
「2」「>」「&」「1」の4つの要素に分解できます。
なお、これらはシェルファイルやバッシュ用のコマンドです。
1と2は何か?
数値の「1」と「2」はそれぞれ以下の内容を表しています。
コマンドを実行したときに、処理の内容は大きく2つにわかれます。
- 処理が正常にいった場合
- エラーが発生した場合
この正常な処理の状況とエラーが発生した状況は区別されています。それぞれを数値で表したのが「1」の標準出力と、「2」の標準エラー出力です。
> とは何か?
>はリダイレクトと呼び、前方の処理内容を後方の処理に転送するものです。
コマンド > 出力先のファイル
この場合、前方のコマンドの実行結果を、後ろで指定したファイルの中に出力します。
その際、ファイルが存在しない場合は新規作成し、ファイルが存在する場合は内容を上書きします。
&
「>(リダイレクト)」を使ったときに、出力先をファイルではなく、標準出力(ターミナル・黒画面)にしたい場合は、ファイルではないことを示す「&」を付けて「&1」とします。
2>&1のまとめ
結果として「2>&1」はエラーが発生した場合も、通常の処理と同じくターミナル(黒画面)に出力するという処理内容になります。
コマンド末尾の&は何か?
コマンド末尾の&の意味
コマンド末尾の「&」は「2 >&1」の「&」とは完全に異なります。
コマンドの最後に「&」をつけて実行すると、そのコマンドをバックグラウンドで動かすという処理になります。
簡単にいうと、コマンドを実行してサーバーや監視機能が起動した状態になったとしても、ターミナル(黒画面)が他のコマンドを入力できる状態になるということです。
バックグラウンドとは何か?
コマンドなどを入力して、実行しているプロセス(処理)をジョブといいます。
通常これらのプロセスはターミナル(黒画面)上で実行されるため、ジョブが終わるまでターミナルで入力することができません。
ジョブを裏側で処理し、ターミナル(黒画面)にコマンドを入力できる状態にしておくことができます。
この裏側でジョブを実行する場所をバックグラウンドといます。
逆に通常のジョブを実行する場所をフォアグラウンドといいます。
なおバック(back)は後ろで、フォア(fore)は前という意味です。
npm run watch 2>&1 &のまとめ
結果として、「npm run watch 2>&1 &」の処理内容をまとめると、「npm run watch」をバックグラウンドで実行して、エラーが発生した場合も通常の処理内容と合わせてその内容を出力するという処理になります。
以下では補足として、「フォアグラウンドとは何か?」や「バックグラウンドの処理の実例」や「バックグラウンドの処理を停止する方法」などを記載しておきます。
フォアグラウンドの処理
フォアグラウンドは通常のコマンドを実行する処理のことです。
例えば、フォアグラウンドでサーバーを立ち上げると、サーバーを停止するまで次のコマンドを入力できない状態になります。
フォアグラウンドの処理例
$ 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