プロセス監視
プロセス管理は 101 試験の得点源です。問われ方は、ps aux の出力を見せて列の意味を答えさせる読解、STAT 欄の記号の意味、kill のシグナル番号の3つで、どれも暗記で確実に取れます。
ps には歴史的に2つの書式があります。ハイフンを付けない BSD 形式と、付ける UNIX 形式です。
| コマンド | 形式 | 意味 |
|---|---|---|
ps aux | BSD | 全ユーザーの全プロセスを、端末に紐づかないものも含めて表示 |
ps -ef | UNIX | 全プロセスを親子関係の列付きで表示 |
ps -eo pid,ppid,comm | UNIX | 表示する列を自分で選ぶ |
ps aux の a は他ユーザーの分も、u はユーザー名を含む詳細形式、x は制御端末を持たないプロセスも、という意味です。ps -ef の e は全プロセス、f はフルフォーマットです。
ps aux の列を読む
| 列 | 意味 |
|---|---|
| USER | 実行しているユーザー |
| PID | プロセス ID |
| %CPU | CPU 使用率 |
| %MEM | 物理メモリ使用率 |
| VSZ | 仮想メモリのサイズ |
| RSS | 実際に使っている物理メモリのサイズ |
| TTY | 制御端末。持たない場合は疑問符 |
| STAT | プロセスの状態 |
| TIME | 累積 CPU 時間 |
| COMMAND | コマンド行 |
ps -ef では UID・PID・PPID・C・STIME・TTY・TIME・CMD という並びになります。PPID があるのが -ef の特徴で、親子関係を追いたいときはこちらです。
STAT の記号
| 記号 | 状態 |
|---|---|
| R | 実行中または実行可能 |
| S | 割り込み可能な待ち状態 |
| D | 割り込み不可能な待ち状態。多くはディスク入出力待ち |
| Z | ゾンビ。終了したが親が終了状態を回収していない |
| T | 停止中。ジョブ制御で止められた状態 |
| + | フォアグラウンドのプロセスグループに属する |
| s | セッションリーダー |
ゾンビは既に終了しているので、シグナルを送っても消えません。消すには親プロセスを終わらせるか、親に回収させます。ここは頻出です。
探すコマンドと止めるコマンド
top は一定間隔で更新しながら CPU 使用率順に並べます。画面内で k を押すとシグナルを送れ、r で nice 値を変えられます。
pgrep は名前でプロセスを探して PID を返します。-l で名前も一緒に出し、-f を付けるとコマンド行全体を検索の対象にします。同じ条件で見つけたプロセスにシグナルを送るのが pkill です。
コマンドの末尾に & を付けるとバックグラウンドで動きます。jobs で一覧、fg %1 でフォアグラウンドに戻し、bg %1 で停止中のジョブをバックグラウンドで再開します。実行中に Ctrl-z を押すと停止状態になり、jobs では Stopped と表示されます。nohup を頭に付けて起動すると、ログアウト時の HUP を無視するので端末を閉じても動き続けます。
| シグナル | 番号 | 意味 |
|---|---|---|
| SIGHUP | 1 | 端末の切断。設定の再読み込みに使われることも多い |
| SIGINT | 2 | 割り込み。Ctrl-c |
| SIGKILL | 9 | 強制終了。捕捉も無視もできない |
| SIGTERM | 15 | 終了要求。kill の既定 |
| SIGSTOP | 19 | 停止。捕捉できない |
| SIGCONT | 18 | 再開 |
kill は番号でも名前でも指定でき、kill -9 PID と kill -KILL PID と kill -s KILL PID は同じ意味です。kill -l で一覧が出ます。まず既定の TERM で終了を頼み、応じないときだけ KILL を使うのが作法です。KILL はプロセスに後始末をさせないので、書きかけのファイルが壊れることがあります。
よくある引っかけ
kill をプロセスを殺すコマンドだと決めつけると、kill -CONT のような使い方を含む選択肢で間違えます。kill は任意のシグナルを送るコマンドです。
kill -9 を最初に使うべきだ、という選択肢も誤りです。ゾンビを kill -9 で消せるという選択肢も、よくある誤答です。