Linuxシステムを効率的に運用するためには、プロセス管理の理解が不可欠です。サーバーの負荷が高いときに原因を特定したり、応答しなくなったアプリケーションを強制終了したりする場面は日常的に発生します。
この記事では、プロセスの基本概念からps、top、killコマンドの実践的な使い方まで、Linuxプロセス管理に必要な知識を体系的に解説します。
前提条件
この記事では以下の環境での動作を確認しています。
| 項目 | バージョン |
|---|---|
| OS | Ubuntu 24.04 LTS / AlmaLinux 9 |
| procps-ng | 4.0以上 |
基本的なLinuxコマンドライン操作ができることを前提としています。
プロセスとは
プロセスとは、実行中のプログラムのインスタンスです。プログラムファイル(実行ファイル)は単なるディスク上のデータですが、それがメモリに読み込まれてCPUで実行されている状態がプロセスです。
graph LR
A[プログラムファイル<br>/usr/bin/bash] -->|実行| B[プロセス<br>PID: 1234]
A -->|実行| C[プロセス<br>PID: 5678]
A -->|実行| D[プロセス<br>PID: 9012]
style A fill:#f9f9f9,stroke:#333
style B fill:#e1f5fe,stroke:#0288d1
style C fill:#e1f5fe,stroke:#0288d1
style D fill:#e1f5fe,stroke:#0288d11つのプログラムから複数のプロセスを起動することが可能です。例えば、複数のターミナルウィンドウを開くと、それぞれが独立したbashプロセスとして動作します。
プロセスの構成要素
各プロセスは以下の要素を持ちます。
| 要素 | 説明 |
|---|---|
| プロセスID(PID) | プロセスを一意に識別する番号 |
| 親プロセスID(PPID) | このプロセスを生成した親プロセスのPID |
| ユーザーID(UID) | プロセスを実行しているユーザー |
| メモリ空間 | プロセス専用の仮想メモリ領域 |
| ファイルディスクリプタ | 開いているファイルへの参照 |
| 環境変数 | プロセスに渡された設定情報 |
プロセスID(PID)と親子関係
PIDの仕組み
すべてのプロセスには一意のプロセスID(PID)が割り当てられます。PIDは正の整数で、通常は1から順に割り当てられ、最大値に達すると再利用されます。
|
|
実行結果の例:
12345
PID 1は特別なプロセスで、システム起動時に最初に起動されるinitまたはsystemdプロセスです。このプロセスはすべてのプロセスの祖先となります。
親子関係とfork
Linuxでは、新しいプロセスは既存のプロセスからfork()システムコールによって生成されます。生成元を親プロセス、生成されたものを子プロセスと呼びます。
graph TD
A[systemd<br>PID: 1] --> B[sshd<br>PID: 1001]
A --> C[nginx<br>PID: 1002]
B --> D[sshd: user@pts/0<br>PID: 2001]
D --> E[bash<br>PID: 2002]
E --> F[vim<br>PID: 3001]
C --> G[nginx: worker<br>PID: 1003]
C --> H[nginx: worker<br>PID: 1004]
style A fill:#ffcdd2,stroke:#c62828
style B fill:#e1f5fe,stroke:#0288d1
style C fill:#c8e6c9,stroke:#388e3c
style D fill:#e1f5fe,stroke:#0288d1
style E fill:#fff3e0,stroke:#ef6c00
style F fill:#fff3e0,stroke:#ef6c00
style G fill:#c8e6c9,stroke:#388e3c
style H fill:#c8e6c9,stroke:#388e3c親プロセスが終了すると、通常は子プロセスも終了しますが、子プロセスが残った場合(孤児プロセス)はsystemd(PID 1)が親として引き継ぎます。
ゾンビプロセス
子プロセスが終了したが、親プロセスがその終了状態を回収していない状態のプロセスをゾンビプロセスと呼びます。ゾンビプロセスはメモリをほとんど消費しませんが、PIDを占有するため、大量に発生するとシステムに影響を与える可能性があります。
|
|
プロセスの状態
プロセスは実行中に様々な状態を遷移します。
| 状態コード | 状態名 | 説明 |
|---|---|---|
| R | Running | 実行中または実行待ち(ランキュー上) |
| S | Sleeping | 割り込み可能なスリープ(イベント待ち) |
| D | Disk Sleep | 割り込み不可能なスリープ(通常はI/O待ち) |
| T | Stopped | ジョブ制御シグナルにより停止 |
| t | Tracing stop | デバッガによるトレース中に停止 |
| Z | Zombie | 終了したが親に回収されていない |
| I | Idle | カーネルスレッドがアイドル状態 |
stateDiagram-v2
[*] --> Running: プロセス生成
Running --> Sleeping: イベント待ち
Sleeping --> Running: イベント発生
Running --> Stopped: SIGSTOP/SIGTSTP
Stopped --> Running: SIGCONT
Running --> Zombie: 終了
Zombie --> [*]: 親が回収
Running --> DiskSleep: I/O待ち
DiskSleep --> Running: I/O完了psコマンドでプロセスを確認する
psコマンドは、現在実行中のプロセスのスナップショットを表示します。
基本的な使い方
引数なしで実行すると、現在のターミナルに関連するプロセスのみを表示します。
|
|
実行結果の例:
PID TTY TIME CMD
2002 pts/0 00:00:00 bash
3456 pts/0 00:00:00 ps
よく使うオプションの組み合わせ
すべてのプロセスを表示(Unix形式)
|
|
| オプション | 説明 |
|---|---|
| -e | すべてのプロセスを選択 |
| -f | フルフォーマットで表示 |
実行結果の例:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan06 ? 00:00:05 /usr/lib/systemd/systemd
root 2 0 0 Jan06 ? 00:00:00 [kthreadd]
root 456 1 0 Jan06 ? 00:00:01 /usr/sbin/sshd -D
user 2002 456 0 10:30 pts/0 00:00:00 -bash
各フィールドの意味:
| フィールド | 説明 |
|---|---|
| UID | プロセスの実効ユーザーID |
| PID | プロセスID |
| PPID | 親プロセスID |
| C | CPU使用率 |
| STIME | プロセス開始時刻 |
| TTY | 制御端末 |
| TIME | 累積CPU時間 |
| CMD | コマンド名と引数 |
すべてのプロセスを表示(BSD形式)
|
|
| オプション | 説明 |
|---|---|
| a | 端末を持つすべてのプロセス |
| u | ユーザー指向のフォーマット |
| x | 端末を持たないプロセスも表示 |
実行結果の例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169128 13456 ? Ss Jan06 0:05 /usr/lib/systemd/systemd
root 456 0.0 0.0 15432 6780 ? Ss Jan06 0:01 sshd: /usr/sbin/sshd -D
user 2002 0.0 0.0 8940 5432 pts/0 Ss 10:30 0:00 -bash
user 3456 0.0 0.0 10632 3456 pts/0 R+ 11:00 0:00 ps aux
各フィールドの意味:
| フィールド | 説明 |
|---|---|
| %CPU | CPU使用率 |
| %MEM | メモリ使用率 |
| VSZ | 仮想メモリサイズ(KB) |
| RSS | 物理メモリ使用量(KB) |
| STAT | プロセス状態(Ss=スリープ中・セッションリーダー、R+=実行中・フォアグラウンド) |
特定のプロセスを検索する
プロセス名で検索
|
|
ただし、この方法ではgrepコマンド自体もマッチしてしまいます。これを回避するには以下のテクニックを使います。
|
|
プロセスツリーを表示
|
|
または専用コマンド:
|
|
実行結果の例:
systemd─┬─sshd───sshd───bash───vim
├─nginx───2*[nginx]
└─systemd-journal
カスタム出力フォーマット
-oオプションで表示するフィールドを指定できます。
|
|
実行結果の例:
PID %CPU %MEM CMD
1234 25.0 5.2 /usr/bin/java -jar app.jar
5678 12.3 3.1 /usr/bin/python3 script.py
9012 5.6 1.2 /usr/sbin/nginx
利用可能な主なフィールド:
| フィールド名 | 説明 |
|---|---|
| pid | プロセスID |
| ppid | 親プロセスID |
| uid | ユーザーID |
| user | ユーザー名 |
| pcpu | CPU使用率 |
| pmem | メモリ使用率 |
| vsz | 仮想メモリサイズ |
| rss | 物理メモリ使用量 |
| stat | プロセス状態 |
| start | 開始時刻 |
| time | CPU時間 |
| cmd | コマンド(引数含む) |
| comm | コマンド名のみ |
topコマンドでリアルタイム監視する
topコマンドは、プロセスの状態をリアルタイムで監視するインタラクティブなツールです。
基本的な使い方
|
|
実行すると、以下のような画面が表示されます。
top - 11:30:45 up 1 day, 2:30, 2 users, load average: 0.50, 0.45, 0.40
Tasks: 150 total, 2 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.0 id, 0.5 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 7976.5 total, 1234.5 free, 3456.7 used, 3285.3 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4123.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 user 20 0 2345678 234567 12345 S 25.0 2.9 5:30.45 java
5678 www-data 20 0 123456 34567 8901 S 12.3 0.4 1:23.45 nginx
9012 root 20 0 45678 12345 6789 R 5.6 0.2 0:45.67 python3
サマリエリアの読み方
最初の数行はシステム全体のサマリ情報を表示します。
1行目:システム情報
| 項目 | 説明 |
|---|---|
| 11:30:45 | 現在時刻 |
| up 1 day, 2:30 | システム稼働時間 |
| 2 users | ログインユーザー数 |
| load average | 1分、5分、15分の平均負荷 |
ロードアベレージはCPUコア数を基準に判断します。4コアのシステムで4.0なら100%使用、8.0なら過負荷状態です。
2行目:タスク情報
| 項目 | 説明 |
|---|---|
| total | プロセス総数 |
| running | 実行中 |
| sleeping | スリープ中 |
| stopped | 停止中 |
| zombie | ゾンビ |
3行目:CPU使用率
| 項目 | 説明 |
|---|---|
| us | ユーザー空間プロセス |
| sy | カーネル(システム)プロセス |
| ni | nice値を変更したプロセス |
| id | アイドル |
| wa | I/O待ち |
| hi | ハードウェア割り込み |
| si | ソフトウェア割り込み |
| st | 仮想化環境でハイパーバイザに奪われた時間 |
4-5行目:メモリ情報
物理メモリとスワップの使用状況を表示します。buff/cacheはカーネルがバッファ/キャッシュとして使用しているメモリで、必要に応じて解放されます。
インタラクティブコマンド
top実行中に使用できる主なキー操作:
| キー | 機能 |
|---|---|
| q | 終了 |
| h | ヘルプ表示 |
| k | プロセスにシグナル送信(kill) |
| r | プロセスのnice値変更(renice) |
| M | メモリ使用率でソート |
| P | CPU使用率でソート(デフォルト) |
| T | 累積CPU時間でソート |
| N | PIDでソート |
| c | コマンドライン表示の切り替え |
| 1 | 各CPUコアを個別表示 |
| H | スレッド表示の切り替え |
| V | ツリー表示 |
| u | 特定ユーザーのプロセスのみ表示 |
| f | 表示フィールドの選択 |
起動時のオプション
|
|
htop:より高機能な代替ツール
htopはtopの高機能版で、カラー表示、マウス操作、横スクロールなどに対応しています。
|
|
プロセスを終了する
killコマンド
killコマンドはプロセスにシグナルを送信します。デフォルトではSIGTERM(15)を送信し、プロセスに正常終了を要求します。
|
|
主要なシグナル
| シグナル番号 | シグナル名 | 動作 | 説明 |
|---|---|---|---|
| 1 | SIGHUP | Term | ハングアップ(設定再読み込みに使用されることも多い) |
| 2 | SIGINT | Term | キーボード割り込み(Ctrl+C) |
| 9 | SIGKILL | Term | 強制終了(キャッチ不可) |
| 15 | SIGTERM | Term | 終了要求(デフォルト) |
| 18 | SIGCONT | Cont | 停止中のプロセスを再開 |
| 19 | SIGSTOP | Stop | プロセスを停止(キャッチ不可) |
| 20 | SIGTSTP | Stop | 端末からの停止(Ctrl+Z) |
SIGTERMとSIGKILLの違い
sequenceDiagram
participant User
participant Shell
participant Process
Note over User,Process: SIGTERM(正常終了)
User->>Shell: kill 1234
Shell->>Process: SIGTERM
Process->>Process: クリーンアップ処理
Process->>Process: ファイル保存
Process->>Process: 接続切断
Process-->>Shell: 終了
Note over User,Process: SIGKILL(強制終了)
User->>Shell: kill -9 1234
Shell->>Process: SIGKILL
Process--xProcess: 即座に終了SIGTERM(15)を使用すべき理由:
- プロセスが終了処理を行える(ファイルのクローズ、一時ファイルの削除など)
- データの損失を防げる
- 子プロセスに終了を通知できる
SIGKILL(9)を使用する場面:
SIGTERMでプロセスが終了しない場合- プロセスが応答しない場合
- 緊急時
|
|
killallコマンド
プロセス名を指定してシグナルを送信します。
|
|
注意:killallは同名のすべてのプロセスにシグナルを送信するため、本番環境では慎重に使用してください。
pkillコマンド
パターンマッチングでプロセスを選択し、シグナルを送信します。
|
|
pgrepコマンド
pkillと同じパターンマッチングでPIDを検索します(シグナルは送信しない)。
|
|
実践的なプロセス管理シナリオ
シナリオ1:高負荷プロセスの特定と対処
|
|
シナリオ2:メモリリークの調査
|
|
シナリオ3:応答しないプロセスの強制終了
|
|
シナリオ4:特定サービスのプロセス一括管理
|
|
プロセス情報を取得する他の方法
/proc ファイルシステム
Linuxカーネルは/procファイルシステムを通じてプロセス情報を公開しています。
|
|
lsofコマンド
プロセスがオープンしているファイルを確認できます。
|
|
まとめ
この記事では、Linuxプロセス管理の基本について解説しました。
プロセス管理のポイントをまとめます。
| コマンド | 用途 |
|---|---|
| ps | プロセスのスナップショット表示 |
| top/htop | リアルタイム監視 |
| kill | 特定PIDにシグナル送信 |
| killall | プロセス名でシグナル送信 |
| pkill/pgrep | パターンマッチングでプロセス操作 |
実運用での注意点:
- プロセス終了時は
SIGTERMを先に試し、SIGKILLは最終手段とする - 本番環境での
killallは影響範囲を確認してから使用する - 高負荷時は
topの更新間隔を長くして負荷を軽減する - systemdで管理されているサービスは
systemctlコマンドで操作する
プロセス管理をマスターすることで、システムの状態を正確に把握し、問題発生時に迅速に対処できるようになります。