1. ホーム
  2. コース一覧
  3. LinuC Level1 v10.0 対策コース(パート1)
  4. ジョブをフォアグラウンドやバックグラウンドで実行する方法について

中級

LinuC Level1 v10.0 対策コース(パート1)

LinuC Level1 v10.0 対策コース(パート1)8/39

ジョブをフォアグラウンドやバックグラウンドで実行する方法について

こちらの記事ではプロセスとジョブ(フォアグラウンドジョブ・バックグラウンドジョブ)について解説します。ジョブとはコマンドラインで実行される一連の処理単位を表し、その処理単位の中にある各実行されるプログラムのインスタンスをプロセスといいます。

目次

  1. プロセス
  2. ジョブ
  3. プロセスにシグナルを送信
  4. まとめ

プロセス

プロセスとは実行中のプログラムのことです。PCのシステム内では常に複数のプログラムが常駐しています。また、ユーザーがプログラムを実行することで、プロセスを生成することも出来ます。ls などで行われる処理もプロセスの一つです。プログラムの実行が終わるとプロセスは消滅します。

プロセスの表示

PCのシステム内で動いているプロセスを表示したい場合はps コマンドを使用します。

ps       # プロセス情報を表示
pstree   # プロセスの階層構造を表示
top      # プロセスの情報を一定間隔で表示

pstree はプロセスの親子関係を階層構造で表示します。

top はプロセスの情報を一定間隔で更新して表示してくれます。表示される順番はCPU使用率の高い順で、更新間隔はデフォルトで3秒に設定されています。「Q」キーでtopプロセスの終了ができます。

ジョブ

ジョブとはコマンドライン1行で実行される、処理の単位を表しています。ジョブはシェルごとに一つ一つ管理され、IDが振られています。例えば、コマンドラインでパイプ(|)を使って複数のコマンドを連結して実行した場合、それらのコマンドは1つのジョブとして扱われ、各コマンドのプロセスがジョブ内で割り振られます。またジョブにはフォアグラウンドジョブとバックグラウンドジョブが存在します。

フォアグラウンドジョブ

ジョブが発生したときに、そのジョブの実行処理が終了するまで新たにジョブを作成することが出来ないジョブのことを、フォアグラウンドジョブといいます。コマンドラインから、バックグラウンドでの実行を指定せずにジョブを生成した場合は、基本的にフォアグラウンドジョブになります。

バックグラウンドジョブ

ジョブをバックグラウンドジョブで実行させたいときには「 & 」をコマンドの最後に付けます。そうすることでプロセスの終了を待たずに次のプロンプトが現れ、次のコマンドを実行することが出来ます。PCが起動している間に永続的に実行されているジョブや、処理に時間がかかるために一度バックグラウンドで実行したいとき、複数のジョブを実行したい場合などに使用されます。

ジョブを制御するコマンド

フォアグラウンドジョブとして実行させたいときはコマンドに何も付けずに実行し、バックグラウンドジョブで実行したい場合はコマンドの最後に「&」をつけます。ジョブ間の移動はジョブIDを使って指定することができます。

# フォアグラウンドで実行
コマンド

# バックグラウンドで実行
コマンド &

# バックグラウンドジョブと一時停止ジョブの表示
jobs
[1] + コマンド     # ジョブID + コマンド名 + &
[2] + コマンド &
[3] - コマンド &   # - の場合は停止
[4] + コマンド &

# ジョブID1のコマンドをバックグラウンドジョブに移動
bg %1

# ジョブID2のコマンドをフォアグラウンドジョブに移動
fg %2

プロセスにシグナルを送信する

シグナルとはプロセスに対して特定の動作を指示する命令のことです。 シグナルを実行中のプロセスに割り込ませます。基本的にプロセスは処理が終わると消滅しますが、シグナルによって強制的に途中で終了させることが出来ます。シグナルを送りたい場合はkill コマンドを使用します。

1.png

よく使用するシグナルは以下の8種類です(全31種類)。

シグナル名シグナル番号説明
SIGHUP1端末の切断によるプロセスの終了
SIGINT2割り込みによるプロセスの終了
SIGILL4不正な命令
SIGKILL9プロセスをキルするシグナル
SIGUSR1, 210, 12ユーザーが定義したシグナル
SIGTERM15デフォルトでプロセスが終了
SIGCONT18一時停止プロセスの再開
SIGSTOP19プロセスの一時停止

プロセスにシグナルを送るときは通常kill コマンドを使用します。

ps aux               # プロセスIDを確認
kill -l              # シグナル一覧を表示
kill シグナル番号 PID   # シグナルとプロセスIDを指定して実行
kill -9 PID          # コマンドを強制終了したい場合
kill -19 PID         # プロセスの一時停止

killallコマンドは同じ名前のプロセスが複数存在し、それらすべてを終了したい場合に使用されます。プロセス名は同じものが存在していても、プロセスIDは一意のため同じ値が存在しません。

ps aux                    # プロセス名を確認
kill -l                   # シグナル一覧を表示
killall -9 プロセス名 # プロセス名から対象を絞り強制終了

pkillkillall と同様にプロセス名を指定して処理を行います。

pgrep プロセス名     # プロセス名からプロセスを検索
pkill プロセス名     # プロセス名から対象を絞り強制終了

まとめ

こちらの記事ではプロセスとジョブについて解説しました。

プロセスとは実行中のプログラムのことです。

ジョブとは、コマンドライン1行で実行される処理の単位を表しています。

ジョブが発生したときに、そのジョブの実行処理が終了するまで新たにジョブを作成することが出来ないジョブのことをフォアグラウンドジョブといいます。

プロセスの終了を待たずに次のプロンプトが表示され、次のジョブを生成することが出来るジョブのことをバックグラウンドジョブといいます。

シグナルとはプロセスに対して特定の動作を指示する命令のことです。

プロセスを終了するシグナルを送りたい場合はkill コマンドを使用します。

記事の内容は理解できましたか?