Linuxシステムを効率的に運用するためには、プロセス管理の理解が不可欠です。サーバーの負荷が高いときに原因を特定したり、応答しなくなったアプリケーションを強制終了したりする場面は日常的に発生します。

この記事では、プロセスの基本概念からpstopkillコマンドの実践的な使い方まで、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:#0288d1

1つのプログラムから複数のプロセスを起動することが可能です。例えば、複数のターミナルウィンドウを開くと、それぞれが独立したbashプロセスとして動作します。

プロセスの構成要素

各プロセスは以下の要素を持ちます。

要素 説明
プロセスID(PID) プロセスを一意に識別する番号
親プロセスID(PPID) このプロセスを生成した親プロセスのPID
ユーザーID(UID) プロセスを実行しているユーザー
メモリ空間 プロセス専用の仮想メモリ領域
ファイルディスクリプタ 開いているファイルへの参照
環境変数 プロセスに渡された設定情報

プロセスID(PID)と親子関係

PIDの仕組み

すべてのプロセスには一意のプロセスID(PID)が割り当てられます。PIDは正の整数で、通常は1から順に割り当てられ、最大値に達すると再利用されます。

1
2
# 現在のシェルのPIDを確認
echo $$

実行結果の例:

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を占有するため、大量に発生するとシステムに影響を与える可能性があります。

1
2
# ゾンビプロセスの確認
ps aux | grep 'Z'

プロセスの状態

プロセスは実行中に様々な状態を遷移します。

状態コード 状態名 説明
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コマンドは、現在実行中のプロセスのスナップショットを表示します。

基本的な使い方

引数なしで実行すると、現在のターミナルに関連するプロセスのみを表示します。

1
ps

実行結果の例:

    PID TTY          TIME CMD
   2002 pts/0    00:00:00 bash
   3456 pts/0    00:00:00 ps

よく使うオプションの組み合わせ

すべてのプロセスを表示(Unix形式)

1
ps -ef
オプション 説明
-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形式)

1
ps aux
オプション 説明
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+=実行中・フォアグラウンド)

特定のプロセスを検索する

プロセス名で検索

1
ps aux | grep nginx

ただし、この方法ではgrepコマンド自体もマッチしてしまいます。これを回避するには以下のテクニックを使います。

1
2
3
4
5
# grepコマンド自体を除外
ps aux | grep '[n]ginx'

# または pgrep を使用
pgrep -a nginx

プロセスツリーを表示

1
ps auxf

または専用コマンド:

1
pstree

実行結果の例:

systemd─┬─sshd───sshd───bash───vim
        ├─nginx───2*[nginx]
        └─systemd-journal

カスタム出力フォーマット

-oオプションで表示するフィールドを指定できます。

1
2
# PID、CPU使用率、メモリ使用率、コマンドを表示
ps -eo pid,pcpu,pmem,cmd --sort=-pcpu | head -10

実行結果の例:

    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コマンドは、プロセスの状態をリアルタイムで監視するインタラクティブなツールです。

基本的な使い方

1
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 表示フィールドの選択

起動時のオプション

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 更新間隔を3秒に設定
top -d 3

# 特定ユーザーのプロセスのみ表示
top -u nginx

# バッチモード(スクリプト用)
top -b -n 1

# 特定のPIDを監視
top -p 1234,5678

htop:より高機能な代替ツール

htoptopの高機能版で、カラー表示、マウス操作、横スクロールなどに対応しています。

1
2
3
4
5
6
7
8
# インストール(Ubuntu/Debian)
sudo apt install htop

# インストール(RHEL/AlmaLinux)
sudo dnf install htop

# 実行
htop

プロセスを終了する

killコマンド

killコマンドはプロセスにシグナルを送信します。デフォルトではSIGTERM(15)を送信し、プロセスに正常終了を要求します。

1
2
3
4
5
6
7
8
# TERMシグナル(デフォルト)を送信
kill 1234

# 明示的にシグナル番号を指定
kill -15 1234

# シグナル名で指定
kill -TERM 1234

主要なシグナル

シグナル番号 シグナル名 動作 説明
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)を使用すべき理由:

  1. プロセスが終了処理を行える(ファイルのクローズ、一時ファイルの削除など)
  2. データの損失を防げる
  3. 子プロセスに終了を通知できる

SIGKILL(9)を使用する場面:

  • SIGTERMでプロセスが終了しない場合
  • プロセスが応答しない場合
  • 緊急時
1
2
3
4
5
# まずTERMを試す
kill 1234

# 数秒待っても終了しない場合にKILLを使用
kill -9 1234

killallコマンド

プロセス名を指定してシグナルを送信します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 名前がnginxのすべてのプロセスにTERMシグナル
killall nginx

# 強制終了
killall -9 nginx

# 確認してから終了(インタラクティブ)
killall -i nginx

# 特定ユーザーのプロセスのみ
killall -u www-data nginx

注意:killallは同名のすべてのプロセスにシグナルを送信するため、本番環境では慎重に使用してください。

pkillコマンド

パターンマッチングでプロセスを選択し、シグナルを送信します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# プロセス名に"nginx"を含むプロセスにシグナル送信
pkill nginx

# 完全一致
pkill -x nginx

# 特定ユーザーのプロセス
pkill -u www-data

# 特定端末のプロセス
pkill -t pts/0

# 古いプロセスにのみシグナル送信(1時間以上前に起動)
pkill -o --older-than 1h python

# シグナル送信前にマッチするプロセスを確認
pgrep -a nginx

pgrepコマンド

pkillと同じパターンマッチングでPIDを検索します(シグナルは送信しない)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# プロセス名で検索
pgrep nginx

# プロセス名とコマンドラインを表示
pgrep -a nginx

# 特定ユーザーのプロセス
pgrep -u www-data

# カウントのみ表示
pgrep -c nginx

実践的なプロセス管理シナリオ

シナリオ1:高負荷プロセスの特定と対処

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# CPU使用率の高いプロセスを確認
ps aux --sort=-%cpu | head -10

# または top で確認(P キーでCPUソート)
top

# 特定のプロセスの詳細を確認
ps -p 1234 -o pid,ppid,user,stat,%cpu,%mem,cmd

# 必要に応じてnice値を変更(優先度を下げる)
renice 10 -p 1234

# または終了
kill 1234

シナリオ2:メモリリークの調査

1
2
3
4
5
6
7
8
# メモリ使用量の多いプロセスを確認
ps aux --sort=-%mem | head -10

# 特定プロセスのメモリ使用量を継続監視
watch -n 1 'ps -p 1234 -o pid,rss,vsz,cmd'

# /proc からより詳細な情報を取得
cat /proc/1234/status | grep -E 'VmSize|VmRSS|VmSwap'

シナリオ3:応答しないプロセスの強制終了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# プロセスの状態を確認
ps -p 1234 -o pid,stat,wchan

# まずTERMシグナルを送信
kill 1234

# 5秒待つ
sleep 5

# まだ存在するか確認
ps -p 1234

# 存在する場合は強制終了
kill -9 1234

シナリオ4:特定サービスのプロセス一括管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# PostgreSQL関連のプロセスを確認
pgrep -a postgres

# すべてのPostgreSQLプロセスを一覧表示
ps aux | grep '[p]ostgres'

# ワーカープロセス数を確認
pgrep -c postgres

# systemdでサービスを管理(推奨)
sudo systemctl status postgresql
sudo systemctl restart postgresql

プロセス情報を取得する他の方法

/proc ファイルシステム

Linuxカーネルは/procファイルシステムを通じてプロセス情報を公開しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# プロセスのコマンドライン
cat /proc/1234/cmdline | tr '\0' ' '

# プロセスの環境変数
cat /proc/1234/environ | tr '\0' '\n'

# プロセスの状態
cat /proc/1234/status

# オープンしているファイル
ls -l /proc/1234/fd/

# メモリマップ
cat /proc/1234/maps

lsofコマンド

プロセスがオープンしているファイルを確認できます。

1
2
3
4
5
6
7
8
# 特定プロセスがオープンしているファイル
lsof -p 1234

# 特定ポートを使用しているプロセス
lsof -i :80

# 特定ファイルを使用しているプロセス
lsof /var/log/syslog

まとめ

この記事では、Linuxプロセス管理の基本について解説しました。

プロセス管理のポイントをまとめます。

コマンド 用途
ps プロセスのスナップショット表示
top/htop リアルタイム監視
kill 特定PIDにシグナル送信
killall プロセス名でシグナル送信
pkill/pgrep パターンマッチングでプロセス操作

実運用での注意点:

  1. プロセス終了時はSIGTERMを先に試し、SIGKILLは最終手段とする
  2. 本番環境でのkillallは影響範囲を確認してから使用する
  3. 高負荷時はtopの更新間隔を長くして負荷を軽減する
  4. systemdで管理されているサービスはsystemctlコマンドで操作する

プロセス管理をマスターすることで、システムの状態を正確に把握し、問題発生時に迅速に対処できるようになります。

参考リンク