「このサーバーで何が動いているのか」を把握することは、障害対応・セキュリティ確認・リソース調査のいずれでも出発点になります。まず ps aux で全プロセスを一覧表示し、STAT列(状態コード)を読む習慣をつけると、異常の兆候を早期に発見できます。
全プロセスを一覧表示して現状を把握する
稼働中のプロセスをすべて表示するには次のコマンドを使います。
ps aux
主な列の意味は次のとおりです。
- USER:プロセスを実行しているユーザー
- PID:プロセスID(操作時に指定する番号)
- %CPU / %MEM:CPU・メモリの使用率
- STAT:プロセスの現在の状態(後述)
- TTY:プロセスが紐付いている端末(
?はバックグラウンドサービス) - COMMAND:実行中のコマンドとその引数
出力が多い場合は | less でページング表示するか、grep で絞り込みます。
# 出力をページングして確認
ps aux | less
# nginx に関連するプロセスだけ抽出
ps aux | grep nginx
親子関係をツリーで確認する
「どのプロセスが何を起動したか」を把握したいときはツリー表示が便利です。ps auxf のオプション f を付けるだけで、インデント付きの木構造で出力されます。
# ツリー形式で全プロセスを表示
ps auxf
# pstree コマンドでも確認できる(PID付き)
pstree -p
systemd 環境では PID 1 が systemd になり、配下に各サービスのプロセスがぶら下がります。旧来の init [3] や mingetty は現代のディストリビューションでは登場しません。ターミナル管理は agetty(systemd-getty@.service)が担っています。
# systemd 環境での ps auxf 出力(抜粋)
USER PID %CPU %MEM STAT COMMAND
root 1 0.0 0.1 Ss /usr/lib/systemd/systemd --switched-root
root 512 0.0 0.0 Ss+ \_ /sbin/agetty -o -p -- \u --noclear tty1
root 820 0.0 0.2 Ss /usr/sbin/sshd -D
root 1201 0.0 0.1 Ss \_ sshd: admin [priv]
apache 1350 0.0 0.3 Sl /usr/sbin/httpd -DFOREGROUND
apache 1351 0.0 0.2 Sl \_ /usr/sbin/httpd -DFOREGROUND
STAT列(プロセス状態)の読み方
STAT列は1文字目がメイン状態、2文字目以降が補足フラグです。状態が通常と異なるプロセスを見つけたら、それが調査の起点になります。
メイン状態(1文字目)
- S:割り込み可能スリープ。通常のI/O待ちなど、正常な待機状態
- R:実行中、またはCPUキュー待ち
- D:割り込み不可スリープ(ディスクI/O待ち)。長時間続く場合は要調査
- T:停止中(シグナルで一時停止されている)
- Z:ゾンビ。終了済みだが親プロセスがまだ回収していない
- I:アイドルカーネルスレッド(Linux 4.14以降。D状態に似るが問題なし)
補足フラグ(2文字目以降)
- s:セッションリーダー
- +:フォアグラウンドプロセスグループのメンバー
- l:マルチスレッド
- N:低優先度(nice値が正)
- <:高優先度(nice値が負)
ある運用現場では、夜間バッチ終了後に D 状態のプロセスが残り続け、NFS マウントの応答不能が原因だったことがありました。D 状態はkillシグナルも届かないため、プロセス単体では解消できません。ストレージやネットワーク側から切り離す必要があります。
特定プロセスを素早く絞り込む
プロセス数が多いサーバーでは、pgrep を使うと grep より的確に絞り込めます。ps aux | grep プロセス名 は grep 自身もヒットしてしまうことがあり、pgrep にはその誤検知がありません。
# コマンド名でPIDを取得
pgrep nginx
# プロセス名とパスを同時に確認
pgrep -a nginx
# 特定ユーザーのプロセスだけ表示
ps aux | awk '$1 == "www-data"'
# CPU使用率の高い順に上位10プロセスを表示
ps aux --sort=-%cpu | head -11
# メモリ使用率の高い順に上位10プロセスを表示
ps aux --sort=-%mem | head -11
systemd環境でサービスの稼働状況を確認する
Rocky Linux・AlmaLinux・Ubuntu Server・Debian など、systemd を採用した現代のディストリビューションでは、サービス単位の確認に systemctl を使うのが最も直感的です。プロセスIDだけでなく、サービス名・ログ・CGroup情報まで一度に確認できます。
# 起動中のサービス一覧を表示
systemctl list-units --type=service --state=running
# 失敗しているサービスだけ抽出
systemctl list-units --type=service --state=failed
# 特定サービスのプロセスツリーと直近ログを確認
systemctl status nginx
# サービスに紐付くメインPIDを確認
systemctl show nginx -p MainPID
systemctl status の出力にはCGroup情報が含まれており、そのサービスが生成したワーカープロセスまで一覧できます。「サービス名 → PID → ps aux でリソース確認」という調査フローが自然につながります。
ゾンビや D 状態が続くときの確認手順
ゾンビプロセス(STAT: Z)は少量なら実害はありませんが、大量に溜まっている場合は親プロセスの問題です。親を特定してサービスを再起動するのが最短の対処になります。
# ゾンビプロセスの数を確認
ps aux | awk '$8 == "Z"' | wc -l
# ゾンビの親プロセス(PPID)を特定
ps -eo pid,ppid,stat,comm | awk '$3 ~ /Z/'
# 親プロセスが何かを確認
ps -p -o pid,comm,args
親プロセスが systemd 管理下のサービスなら systemctl restart サービス名 で親ごと再生成されます。D 状態が複数のプロセスで長時間続く場合は、ストレージ側のI/Oエラーを dmesg -T | tail -50 や journalctl -xe で確認してください。NFS・iSCSI・ローカルディスクの障害がプロセスに波及しているケースがほとんどです。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
