Infra Engineer

ジョブとバックグラウンド実行~jobs・fg・bgコマンド~
2021.10.29
Lv1

ジョブとバックグラウンド実行~jobs・fg・bgコマンド~

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、ジョブとバックグラウンド実行について解説します。

・ジョブとは
・jobsコマンド
・fgコマンド
・bgコマンド
・まとめ
確認問題

ジョブとは

ひとつのコマンドを実行したとしても、立ち上がるプロセスはひとつとは限りません。つまり、コマンドとプロセスは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つのジョブが実行されているのが分かります。
「+」は直前に実行していたジョブを、「-」はその前に実行していたジョブを表します。

例②)
ジョブ一覧をプロセスIDとともに表示。(-l)
[user@localhost ~]# jobs -l
[1]+  2011 停止 (tty 出力)     watch ps
[2]-  2851 実行中               tail -f sample001.txt &

「-l」オプションを使用すると、プロセスIDを表示させることができます。


fg

指定したジョブをフォアグラウンドで実行するためには「fg」コマンドを使用します。

fg
意味 ジョブをフォアグラウンドで実行するように切り替える。
書式 fg [ジョブ番号]
例)
バックグラウンドで実行中の「watch ps」をフォアグラウンドで実行するように切り替える。
[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  [ジョブ番号]
例)
バックグラウンドで実行中の「tail -f sample001.txt &」をフォアグラウンドで実行するように切り替え、一時停止して再びバックグラウンドで実行に切り替える。
[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

解答・解説
答え:B

A) ⇒ ジョブをバックグラウンド実行に切り替えるコマンドです。
B) ⇒ 正解です。
C) ⇒ 実行中のプロセスを表示するコマンドです。
D) ⇒ ファイルを一覧表示するコマンドです。