MENU

サーバーで何が動いているかを把握する|プロセス一覧の確認と状態の読み方

「このサーバーで何が動いているのか」を把握することは、障害対応・セキュリティ確認・リソース調査のいずれでも出発点になります。まず 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 -50journalctl -xe で確認してください。NFS・iSCSI・ローカルディスクの障害がプロセスに波及しているケースがほとんどです。

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次