ジョブとバックグラウンド実行~jobs・fg・bgコマンド~
本記事の対象者
LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。
今回の内容
今回は、ジョブとバックグラウンド実行について解説します。
ジョブとは
ひとつのコマンドを実行したとしても、立ち上がるプロセスはひとつとは限りません。つまり、コマンドとプロセスは1対1で対応しているわけではありません。
コマンドやプログラムを実行したときの処理のひとまとまりの単位を「ジョブ」と呼びます。コマンドの場合、コマンドラインの一行がひとつのジョブに相当すると考えても相違ありません。例えば、パイプを使用して複数のコマンドをつなげて実行した場合、それでひとつのジョブとみなします。
[user@localhost ~]# ls | tee sample.txt //複数のコマンドの組み合わせだが、この一行でひとつのジョブ
また、ジョブには「フォアグラウンドジョブ」と「バックグラウンドジョブ」があります。
通常、コマンドを実行するとフォアグラウンドで実行され、そのジョブが終了するまで、シェル上で他のコマンドを実行することができません。
バックグラウンドでジョブを実行することで、そのジョブの終了を待たずに次のジョブをシェル上で実行することができます。
コマンドラインの末尾に「&」をつけることで、バックグラウンド実行が可能です。
[user@localhost ~]# less sample.txt & [1] 2761 [user@localhost ~]# //すぐに次のコマンドが実行可能な状態に [user@localhost ~]# ps PID TTY TIME CMD 1539 pts/0 00:00:00 bash 2761 pts/0 00:00:00 less 2781 pts/0 00:00:00 ps
末尾に「&」をつけて実行したことで、「less sample.txt」がバックグラウンドで実行されました。
直後に出力されているのは、ジョブIDとプロセスIDです。
ジョブの終了を待たずにすぐに次のコマンドが入力可能な状態になっています。
プロセスIDはシステム全体で重複することはありませんが、ジョブはユーザ側の単位なので、ジョブIDは端末ごとに割り当てられます。
jobs
バックグラウンドで実行中、一時停止中のジョブの一覧を確認するには「jobs」コマンドを使用します。jobs | |
---|---|
意味 | 現在バックグラウンドで実行中、一時停止中のジョブ一覧を表示する。 |
書式 | jobs [オプション] |
jobsコマンドのオプションで抑えておくべきものは以下です。
オプション | 説明 |
---|---|
-l | プロセスIDとそのジョブを表示する。 |
-p | プロセスIDのみ表示する。 |
[user@localhost ~]# jobs [1]+ 停止 watch ps [2]- 実行中 tail -f sample001.txt &
2つのジョブが実行されているのが分かります。
「+」は直前に実行していたジョブを、「-」はその前に実行していたジョブを表します。
[user@localhost ~]# jobs -l [1]+ 2011 停止 (tty 出力) watch ps [2]- 2851 実行中 tail -f sample001.txt &
「-l」オプションを使用すると、プロセスIDを表示させることができます。
fg
指定したジョブをフォアグラウンドで実行するためには「fg」コマンドを使用します。fg | |
---|---|
意味 | ジョブをフォアグラウンドで実行するように切り替える。 |
書式 | fg [ジョブ番号] |
[user@localhost ~]# jobs -l [1]+ 2011 停止 (tty 出力) watch ps [2]- 2851 実行中 tail -f sample001.txt & [user@localhost ~]# fg 1 watch ps [user@localhost ~]# jobs -l [2]+ 2851 実行中 tail -f sample001.txt &
fgコマンドでジョブ番号1を指定したことで「watch ps」がフォアグラウンド実行に切り替わり、jobsコマンドの一覧から消えたことが分かります。
bg
指定したジョブをバックグラウンドで実行するためには「bgコマンド」を使用します。bg | |
---|---|
意味 | ジョブをバックグラウンドで実行するように切り替える。 |
書式 | bg [ジョブ番号] |
[user@localhost ~]# jobs -l [2]- 2851 実行中 tail -f sample001.txt & [user@localhost ~]# fg 2 tail -f sample001.txt ^Z [2]+ 停止 tail -f sample001.txt [user@localhost ~]# jobs -l [2]+ 2851 停止 tail -f sample001.txt [user@localhost ~]# bg 2 [2]+ tail -f sample001.txt & [user@localhost ~]# jobs -l [2]+ 2851 実行中 tail -f sample001.txt &
「tail -f sample001.txt」を「fg 2」でフォアグラウンド実行に切り替えた後、「Ctrl + Z」で一時停止し、その後「bg 2」で再びバックグラウンド実行に切り替えています。
まとめ
今回は、「ジョブ」とフォアグラウンド実行、バックグラウンド実行について解説しました。
「プロセス」と「ジョブ」は初心者が混同しやすい部分ですので、意識して区別しましょう。
ジョブ操作について以下に図としてまとめておきます。
最後に確認問題で今回学習した内容を是非確かめてください。
確認問題
現在のシェルで実行されているすべてのバックグラウンドタスクのリストを表示するコマンドはどれですか?
A) bg
B) jobs
C) ps aux
D) ls