ジョブって何?
ジョブ
とは、シェル上で実行したコマンドやプログラム等の処理の単位の事を指します。
例えば、lsコマンドを実行した場合に1ジョブが生成されます。ll / | grep "tmp"
とターミナル上で実行した場合にプロセスは2つ生成されますが、ジョブは1つ生成されます。(コマンド毎にプロセスが生成されている。)
基本的には、ターミナル上で入力した一行のコマンド等が1つのジョブとなります。
また、シェル単位でジョブ番号は管理されております。
ジョブの確認
jobs
コマンドを使用する事で、ジョブの一覧(実行/停止等)を表示する事が出来ます。
ジョブを稼働させていない場合は、特に何も表示されません。
[root@localhost ~]# jobs
[root@localhost ~]#
ジョブの状態を確認したいので、sleepコマンドを実行後にCtrl + z
で一時停止させます。
再度jobs
コマンドを実行すると、停止
となっているジョブが表示されました。
先頭に記載されている[1]や[2]
は、ジョブ番号となっております。また、その横の+
は現在のジョブはカレントジョブを表しており、-
の場合はその前のジョブを表しています。
[root@localhost ~]# sleep 100
^Z
[1]+ 停止 sleep 100
[root@localhost ~]# jobs
[1]+ 停止 sleep 100
[root@localhost ~]# sleep 1000
^Z
[2]+ 停止 sleep 1000
[root@localhost ~]# jobs
[1]- 停止 sleep 100
[2]+ 停止 sleep 1000
フォアグラウンドとバックグラウンド
ジョブには、フォアグラウンド
とバックグラウンド
があります。
フォアグラウンド
はユーザの操作対象となっているジョブです。バックグラウンド
はユーザの操作対象ではないが、処理は継続しているジョブとなります。
コンソール上でコマンドを実行すると、フォアグラウンドで処理されます。
ジョブが終了するまで、他のコマンドは動作出来ません。
処理を継続しつつ、他の作業を行いたい場合等にバックグラウンドでジョブを動作させます。
先程、一時停止したsleepコマンドをフォアグラウンドで動作させます。
ジョブをフォアグラウンドで実行する場合は、fg
コマンドを使用します。
構文はfg %[ジョブ番号]
となります。なお、ジョブ番号を省略した場合はカレントジョブがフォアグラウンドになります。
[root@localhost ~]# jobs
[1]- 停止 sleep 100
[2]+ 停止 sleep 1000
[root@localhost ~]# fg %1
sleep 100
お次は、バックグラウンドでジョブを動作させます。
ジョブをバックグラウンドで実行する場合は、bg
コマンドを使用します。
構文はbg %[ジョブ番号]
となります。なお、ジョブ番号を省略した場合はカレントジョブがバックグラウンドになります。
sleep 10;echo "10秒経過" >> test.txt"
と記載したスクリプトを作成し、バックグラウンドで動作させます。
[root@localhost ~]# bash test.sh
^Z
[1]+ 停止 bash test.sh
[root@localhost ~]# jobs
[1]+ 停止 bash test.sh
[root@localhost ~]# bg
[1]+ bash test.sh &
[root@localhost ~]#
[1]+ 終了 bash test.sh
[root@localhost ~]# cat test.txt
10秒経過
短い時間で処理が終わる場合は、余り恩恵はないように感じますが、、
長い時間の処理の場合は、他の作業も並行して行える点は便利です。
また、コマンドの末尾に&
とつけて実行すると、最初からバックグラウンドでジョブを実行できます。
[root@localhost ~]# bash test.sh &
[1] 9407
[root@localhost ~]# jobs
[1]+ 実行中 bash test.sh &
終わりに
バックグラウンドでジョブ実行する事は結構あるので、覚えておいた方が良いです。
私は、fg
コマンドやbg
コマンドはあまり使う機会はないです。