Linuxのジョブという考え方(jobs)
Linuxにはジョブという概念があります。この考え方をうまく利用することで効率よくコンピュータに処理をさせる事ができます。ここではジョブの考え方についての説明と、ジョブの確認方法(jobs)について説明します。
Last Update : 2014年03月07日
Linuxのジョブという考え方(jobs)項目
1. ジョブとは
ジョブとは、1つ以上のプログラム(コマンド)でまとまった、ひとかたまりの処理の事をいいます。
コマンド1つでもジョブになりますし、コマンドをパイプ「|」でつなげた場合や、(command; command;)のように「()カッコ」や、「{}」でくくった複合コマンド、command && command のようなリストされたコマンドのかたまりも1つのジョブとして認識されます。
# sleep 60 ← これはジョブ # ( sleep 60; sleep 60 ) ← これもジョブ # { sleep 60; sleep 60; } ← これもジョブ # sleep 60 && sleep 60 ← これもジョブ
2. フォアグラウンドジョブとバックグラウンドジョブ
ジョブは、ユーザーの操作の対象になっているフォアグラウンドジョブと、ユーザーの操作対象にはなっていないけれど処理自体は実行されているバックグラウンドジョブにわかれます。
通常プログラム(コマンド等)を実行するとフォアグラウンドジョブとしてプログラムは実行されます。フォアグラウンドジョブは、そのジョブが終了するまで次のコマンドの入力はできませんが、キーボードの入力を受け付けます。
# sleep 60
← sleepコマンドが終了するまで次のコマンドを実行できない。
# sleep 60 ^Z ← Ctrl + z を押した(=プロセスにジョブ停止のシグナルを送るという意味) [1]+ 停止 sleep 60 ← キーボードの入力を受け付けて処理が停止される。 #
一方、バックグラウンドジョブの場合は処理が実行中であっても次のコマンドを実行することができますが、キーボードからのシグナルを受け取る事ができません。
# sleep 60 & ← sleepコマンドをバックグラウンドジョブとして実行。 [1] 26718 # date ← すぐに次のコマンドを実行できる。 2014年 3月 6日 木曜日 08:37:21 JST
3. 実行中のジョブを確認する(jobs)
現在実行中のジョブを確認するには、「jobs」コマンドを使用します。
シェルは現在実行中のジョブを管理するテーブルを持っています。ジョブが構成されるとこのテーブルにジョブの情報が保存されます。
「jobs」コマンドは、このテーブルに保存されているジョブをリスト表示するコマンドです。
コマンド一つを実行中の場合
# sleep 60 & ← バックグラウンドでsleepコマンド実行。 [1] 18600 # jobs [1]+ 実行中 sleep 60 & ← ジョブとして認識される。
memo
コマンドが制御演算子 & で終わっている場合、シェルはコマンドをサブシェル内でバックグラウンド(background)ジョブとして実行します。
複合コマンドを実行中の場合
# (sleep 60; sleep 60;) &
[1] 18636
# jobs
[1]+ 実行中 ( sleep 60; sleep 60 ) & ← ジョブとして認識される。
memo
コマンドを ; で区切った場合は、コマンドが順番に実行されます。
AND リストでコマンドを実行中の場合
# sleep 60 && sleep 60 &
[1] 18626
# jobs
[1]+ 実行中 sleep 60 && sleep 60 & ← ジョブとして認識される。
コマンドを複数実行中の場合
# sleep 60 & ← 1つ目のコマンドを実行。 [1] 26856 # sleep 60 & ← 2つ目のコマンドを実行。 [2] 26857 # sleep 60 & ← コマンドを3個同時に実行。 [3] 26858 # jobs [1] 実行中 sleep 60 & [2]- 実行中 sleep 60 & [3]+ 実行中 sleep 60 & コマンド3個がジョブとして認識される。