プロセスとジョブまとめ

記事の内容


プロセスとジョブについてまとめました. 動作環境は, MacBookPro+fishシェルです.

プロセスとジョブ

基礎知識

プロセスとは, OSが動作中のプログラムを管理する際に用いる基本単位です. 一方, ジョブとは, シェルが実行中のプログラムを管理する際に用いる基本単位で, 1つのコマンドに相当します. ジョブは複数のプロセスであり, 単位としてはジョブの方が大きいです.

プロセスの管理

一覧表示

プロセスを一覧表示する方法はいくつかあります. 最もシンプルなのは, psコマンドをそのまま使う方法です.

psコマンド】
~> ps
psコマンド; 実行結果】
  PID TTY           TIME CMD
55690 ttys000    0:00.13 -fish

PIDはプロセスIDです. このIDでプロセスを識別します. TTYは端末を表します. 今回の実行例では, Macのターミナルを1つだけ開いているので, TTYも1種類のみです.

psの後にキーワードを渡すことで, さらに詳しい情報が得られます. 以下は入力例です. 出力は省略します. プロセスの状態などが把握できます.

psコマンドの実行例】
~> top
~> ps ax
~> ps aux

プロセスの停止

プロセスを(強制的に)終了させたい時は, killコマンドを用います. killコマンドを用いると, プロセスの状態を変化させることができます. プロセスに「シグナル」を送ることで, 状態を変化させます. 利用可能なシグナルの一覧はkill -lで表示できます. 今回はデフォルトのTERMシグナルを用います. デフォルトなので, 明示的に指定する必要はありません.

まずは, プロセスを追加します. プロセスの例として, sleepコマンドを用います. &を用いています. これはバックグラウンドで実行するためのものです. 後ほど解説します.

【プロセスの追加と確認】
~> sleep 100 &
~> ps

プロセスを追加したので, 確認しましょう.

【プロセスの追加と確認; 実行結果】
  PID TTY           TIME CMD
55690 ttys000    0:00.22 -fish
55774 ttys000    0:00.00 sleep 100

プロセスIDが55774のプロセスが追加されました. これを強制的に終了させます. killコマンドにプロセスIDを渡します.

killコマンドの実行】
~> kill 55774
killコマンドの実行; 実行結果】
fish: Job 1, 'sleep 100 &' terminated by signal SIGTERM (Polite quit request)

終了できたか確認します.

【再度プロセスを確認】
~> ps
【再度プロセスを確認; 実行結果】
  PID TTY           TIME CMD
55690 ttys000    0:00.30 -fish

追加した分のプロセスが消えています. 終了に成功しました.

killコマンドは, プロセスIDを受け取ってプロセスを終了します. killallを用いると, プロセスの名前を用いることができます. 例えば, 先ほどのsleepコマンドによるプロセスが複数あるとします.

【プロセスの追加と確認】
~> sleep 300 &; sleep 400 &;
~> ps
【プロセスの追加と確認; 実行結果】
  PID TTY           TIME CMD
55690 ttys000    0:00.70 -fish
55864 ttys000    0:00.00 sleep 300
55865 ttys000    0:00.00 sleep 400

killallでプロセスを終了します.

killallコマンドの実行】
~> killall sleep
killallコマンドの実行; 実行結果】
fish: Job 2, 'sleep 400 &' terminated by signal SIGTERM (Polite quit request)
fish: Job 1, 'sleep 300 &' terminated by signal SIGTERM (Polite quit request)

終了できたか確認します.

【再度プロセスを確認】
~> ps
【再度プロセスを確認; 実行結果】
  PID TTY           TIME CMD
55690 ttys000    0:00.75 -fish

2つとも終了できました. 同じことは, killコマンドにプロセスIDを二つ渡すことで実現できます. 次のコードでもできます.

【別の方法】
~> pgrep sleep | xargs kill

ジョブの管理

一覧表示

ジョブを一覧表示するには, jobsコマンドを使います.

jobsコマンド】
~> jobs
jobsコマンド; 実行結果】
jobs: There are no jobs

何も実行していないので, 何も表示されません. 適当にジョブを追加します. ジョブを追加した状態でjobsコマンドを実行します.

jobsコマンド】
~> sleep 300 &; sleep 400 &;
~>jobs
jobsコマンド; 実行結果】
Job	Group	State	Command
2	55920	running	sleep 400 &
1	55919	running	sleep 300 &

一番左の番号はジョブ番号です. 各ジョブはこの番号で識別されます. その右の番号はプロセスIDです. "State"の列は, "running"と"stopped"の2種類の文字列が表示されます. "running"の場合は実行中, "stopped"の場合は実行一時停止中です. 上の例では, どちらのジョブも実行中です.

フォアグラウンドとバックグラウンド

ジョブは, フォアグラウンド, またはバックグラウンドで実行されます. また, 実行停止状態も入れると, ジョブには全部で3つの状態があります.

この節では, 3つの状態内でジョブを変化させます. 主に, 次のコマンドが用いられます.

  • フォアグラウンドからバックグラウンドへは, コマンドの最後に&をつけて実行する.
  • フォアグラウンドから停止状態へは, Ctrl+Zを押下する.
  • 停止状態からフォアグラウンドへは, fgコマンドを用いる.
  • 停止状態からバックグラウンドへは, bgコマンドを用いる.
  • バックグラウンドからフォアグラウンドへは, fgを用いる.

&は, 以前用いました. sleep 100 &のような形で用いました. これは, バックグラウンドで実行するためのコードでした. ここでは, 他の状態遷移を例で見てみましょう.

まず, topを実行して, Ctrl+Zで中断します. これで停止状態に移行します.

【フォアグラウンドから停止状態へ】
~> top
#表示されたらCtrl+Zを押下
【フォアグラウンドから停止状態へ; 実行結果】
fish: Job 1, 'top' has stopped

次に, bgコマンドを用います. bgコマンドに, ジョブを%ジョブ番号の形で指定します. これでtopコマンドがバックグラウンドで実行されます.

【停止状態からバックグラウンドへ】
~> bg %1
【停止状態からバックグラウンドへ; 実行結果】
Send job 1 'top' to background

次に, fgコマンドを用います. fgコマンドに, ジョブを%ジョブ番号の形で指定します. これでtopコマンドがフォアグラウンドで実行されます.

【バックグラウンドからフォアグラウンドへ】
~> fg %1
【バックグラウンドからフォアグラウンドへ; 実行結果】
Send job 1, 'top' to foreground

再び, フォアグラウンドから停止状態に移行します.

【フォアグラウンドから停止状態へ】
~> top
#表示されたらCtrl+Zを押下
【フォアグラウンドから停止状態へ; 実行結果】
fish: Job 1, 'top' has stopped

今度は逆に, 停止状態でfgコマンドを用います. これでフォアグラウンドへ戻ります.

【停止状態からフォアグラウンドへ】
fg %1
【停止状態からフォアグラウンドへ; 実行結果】
Send job 1, 'top' to foreground

ジョブの停止

ジョブを(強制的に)終了させたい時にも, killコマンドを用います. 基本的な使い方は先ほどと同様です. killコマンドにジョブ番号を%ジョブ番号の形で渡します.

まずは, ジョブを追加します.

【ジョブの追加と確認】
> sleep 300 &;
> jobs
【ジョブの追加と確認; 実行結果】
Job	Group	State	Command
1	56278	running	sleep 300 &

ジョブ番号1のジョブが追加されました. これを強制的に終了させます. killコマンドにジョブ番号を渡します.

killコマンドの実行】
kill %1
killコマンドの実行; 実行結果】
fish: Job 1, 'sleep 300 &' terminated by signal SIGTERM (Polite quit request)

終了できたか確認します.

【再度ジョブを確認】
~> jobs
【再度ジョブを確認; 実行結果】
jobs: There are no jobs

追加した分のジョブが消えています. 終了に成功しました.

参考文献
      [1] 林晴彦, 新Linux/UNIX入門, SB Creative, 2000
      [2] 西村めぐみ, [新版zsh&bash対応]macOS×コマンド入門, 技術評論社, 2020
      [3] 中島能和, Linux教科書LPICレベル1 Version5.0 対応, 翔泳社, 2019