Linuxで動いているプロセスを確認する方法|ps・top・pgrepの使い分け

Linux

Linuxサーバーや開発環境で作業しているとき「今このマシンでどんなプロセスが動いているのか?」「CPUを大量に消費しているプロセスは?」「特定のサービスが正常に動いているか?」を知りたい場面はよくあります。

こんな場面で必要になります

  • CPUやメモリ負荷の調査
  • デーモンサービスの動作確認
  • 異常なプロセスの特定と停止
  • システムパフォーマンスの監視
  • セキュリティインシデントの調査
  • アプリケーションのトラブルシューティング

プロセス管理はLinux運用の基本中の基本です。適切にプロセスを監視できれば、システムの問題を早期発見して対処できます。

この記事では、Linuxで現在動いているプロセスを確認するための基本的なコマンドを、具体的な例を交えて初心者にもわかりやすく解説します。

これを読めば、Linuxシステムの状況を的確に把握できるようになりますよ!

スポンサーリンク

プロセスとは?基本概念の理解

プロセスの基本

プロセスとは、実行中のプログラムのことです。Linuxシステムでは、起動したプログラムはそれぞれ独立したプロセスとして管理されます。

プロセスの主要な特徴

  • PID(Process ID):各プロセスに割り当てられる一意の番号
  • PPID(Parent PID):親プロセスのPID
  • 状態:実行中、停止中、ゾンビなど
  • リソース使用量:CPU、メモリ、ファイルディスクリプタなど

プロセスの種類

フォアグラウンドプロセス

  • ターミナルから直接実行されるプロセス
  • 終了するまでターミナルを占有
  • 例:vi editor.txtmake

バックグラウンドプロセス

  • ターミナルを占有せずに実行されるプロセス
  • &をつけてバックグラウンド実行
  • 例:firefox &

デーモンプロセス

  • システム起動時から継続して動作
  • バックグラウンドでサービスを提供
  • 例:sshdnginxmysqld

psコマンドでプロセス確認

ps auxで全プロセス一覧

最もよく使う基本形式

ps aux

オプションの意味

  • a:他ユーザーのプロセスも含む
  • u:実行ユーザー名を表示
  • x:制御端末を持たないプロセス(デーモンなど)も表示

出力例

USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       1  0.0  0.1 169176  7648 ?        Ss   06:00   0:01 /usr/lib/systemd/systemd
root       2  0.0  0.0      0     0 ?        S    06:00   0:00 [kthreadd]
www-data 1234  2.1  1.5 123456 15678 ?        S    08:30   0:15 nginx: worker process
mysql    2345  1.8  8.2 987654 84321 ?        Ssl  08:25   1:23 /usr/sbin/mysqld
user     3456  0.5  2.1 234567 21234 pts/0    S+   09:00   0:05 python3 app.py

各列の説明

  • USER:プロセスの所有者
  • PID:プロセスID
  • %CPU:CPU使用率
  • %MEM:メモリ使用率
  • VSZ:仮想メモリサイズ(KB)
  • RSS:物理メモリ使用量(KB)
  • TTY:制御端末(?はデーモン)
  • STAT:プロセスの状態
  • START:開始時刻
  • TIME:累積CPU時間
  • COMMAND:コマンド名

プロセス状態(STAT)の読み方

主要な状態コード

  • R:実行中(Running)
  • S:スリープ中(Sleeping)
  • D:割り込み不可能なスリープ
  • T:停止中(sToppped)
  • Z:ゾンビプロセス
  • <:高優先度
  • N:低優先度
  • L:メモリページがロック済み
  • s:セッションリーダー
  • l:マルチスレッド
  • +:フォアグラウンドプロセス

特定のプロセスを検索

grepと組み合わせて絞り込み

# nginxプロセスを確認
ps aux | grep nginx

# Pythonプロセスを確認
ps aux | grep python

# ユーザー名でフィルタ
ps aux | grep "^www-data"

より詳細な絞り込み

# 特定ユーザーのプロセスのみ
ps -u username

# プロセス名で直接指定
ps -C nginx

# PIDを指定
ps -p 1234,5678

ツリー表示でプロセス階層を確認

プロセスツリー表示

ps auxf
# または
ps aux --forest

psプロセスツリー専用コマンド

pstree
# ユーザー名付きで表示
pstree -u
# PID付きで表示
pstree -p

出力例

systemd(1)─┬─NetworkManager(543)─┬─{NetworkManager}(567)
           │                     └─{NetworkManager}(568)
           ├─nginx(1234)─┬─nginx(1235)
           │             ├─nginx(1236)
           │             └─nginx(1237)
           └─sshd(891)───sshd(2341)───bash(2342)───pstree(2398)

topコマンドでリアルタイム監視

topの基本的な使い方

基本実行

top

topの画面構成

top - 14:30:15 up 2 days,  8:15,  2 users,  load average: 0.15, 0.25, 0.20
Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.1 us,  0.8 sy,  0.0 ni, 96.8 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7976.2 total,   1234.5 free,   2341.2 used,   4400.5 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   5234.1 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 www-data  20   0  123456  45678  12345 S   2.1   0.6   0:15.23 nginx
 2345 mysql     20   0  987654 654321  87654 S   1.8   8.2   1:23.45 mysqld
 3456 user      20   0  234567  87654  23456 S   0.5   1.1   0:05.67 python3

ヘッダー情報の説明

  • load average:システム負荷(1分、5分、15分平均)
  • Tasks:プロセス数の内訳
  • %Cpu(s):CPU使用率の内訳
  • Mem/Swap:メモリとスワップの使用状況

topの便利な操作

基本操作

  • q:終了
  • h:ヘルプ表示
  • Space:画面更新
  • k:プロセスを終了(PIDを入力)

ソート操作

  • P:CPU使用率順にソート(デフォルト)
  • M:メモリ使用率順にソート
  • T:累積CPU時間順にソート
  • N:PID順にソート

表示設定

  • 1:CPUコア別表示の切り替え
  • t:CPU使用率表示の切り替え
  • m:メモリ表示の切り替え
  • c:コマンドライン表示の切り替え

フィルタリング

  • u:特定ユーザーのプロセスのみ表示
  • o:フィールドでフィルタ(例:%CPU>5.0

topの応用オプション

バッチモードで実行

# 1回だけ実行して終了
top -b -n 1

# 10秒間隔で更新
top -d 10

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

出力をファイルに保存

# システム負荷をログに記録
top -b -n 1 >> system_load.log

htopで視覚的なプロセス監視

htopの特徴

htoptopの改良版で、より直感的で使いやすいインターフェースを提供します。

htopのインストール

# Ubuntu/Debian
sudo apt update && sudo apt install htop

# CentOS/RHEL
sudo yum install htop
# または
sudo dnf install htop

# macOS
brew install htop

htopの実行

htop

htopの便利な機能

視覚的表示

  • CPUコアごとの使用率をバー表示
  • メモリとスワップの使用状況をバー表示
  • カラフルで見やすいインターフェース

便利な操作

  • F1:ヘルプ
  • F2:設定
  • F3:検索
  • F4:フィルタ
  • F5:ツリー表示切り替え
  • F6:ソート選択
  • F9:プロセス終了
  • F10:終了

マウス対応

  • プロセスのクリック選択
  • スクロールバーの操作
  • ボタンのクリック

pgrepとpkillでプロセス操作

pgrepで特定プロセスのPID取得

基本的な使い方

# プロセス名でPIDを検索
pgrep nginx

# 出力例
1234
1235
1236

pgrepの便利なオプション

# 詳細情報付きで表示
pgrep -l nginx
# 出力:1234 nginx: master process

# 完全一致で検索
pgrep -x nginx

# ユーザーを指定
pgrep -u www-data nginx

# 最新のプロセスのみ
pgrep -n nginx

# 最古のプロセスのみ
pgrep -o nginx

# 件数をカウント
pgrep -c nginx

pkillでプロセスを終了

基本的な使い方

# プロセス名で終了
pkill nginx

# 特定ユーザーのプロセスを終了
pkill -u username

# 強制終了(SIGKILL)
pkill -9 process_name

# 確認してから終了
pkill -i nginx

安全なプロセス終了の流れ

# 1. プロセスを確認
pgrep -l nginx

# 2. 通常終了を試行(SIGTERM)
pkill nginx

# 3. しばらく待って再確認
sleep 5
pgrep nginx

# 4. まだ残っている場合は強制終了
pkill -9 nginx

その他の便利なプロセス確認コマンド

systemctlでサービス状態確認

systemd管理サービスの確認

# 特定サービスの状態確認
systemctl status nginx

# 全サービスの状態一覧
systemctl list-units --type=service

# 実行中のサービスのみ
systemctl list-units --type=service --state=running

# 失敗したサービス
systemctl list-units --type=service --state=failed

systemctl status の出力例

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2024-01-15 08:30:15 JST; 2h 15min ago
     Docs: man:nginx(8)
  Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 1235 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 1236 (nginx)
    Tasks: 3 (limit: 4915)
   Memory: 15.2M
   CGroup: /system.slice/nginx.service
           ├─1236 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─1237 nginx: worker process
           └─1238 nginx: worker process

lsofでファイルやポートを使用中のプロセス確認

特定ポートを使用しているプロセス

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

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

# 特定IPとポートの組み合わせ
lsof -i 192.168.1.100:22

特定ファイルを開いているプロセス

# ファイルを使用しているプロセス
lsof /var/log/nginx/access.log

# ディレクトリ以下のファイルを使用しているプロセス
lsof +D /var/www/html

jobsでバックグラウンドジョブ確認

現在のシェルのバックグラウンドジョブ

# バックグラウンドジョブ一覧
jobs

# 詳細情報付き
jobs -l

# 実行中のジョブのみ
jobs -r

# 停止中のジョブのみ
jobs -s

実用的なプロセス監視テクニック

CPU使用率の高いプロセスを特定

CPU使用率順にソート

# topでCPU順ソート(デフォルト)
top

# psでCPU順ソート
ps aux --sort=-%cpu | head -10

# CPU使用率5%以上のプロセス
ps aux | awk '$3 > 5.0 {print $0}'

メモリ使用量の確認

メモリ使用量順にソート

# topでメモリ順ソート
top # 起動後にMキーを押す

# psでメモリ順ソート
ps aux --sort=-%mem | head -10

# メモリ使用量100MB以上のプロセス
ps aux | awk '$6 > 100000 {print $0}'

プロセスの実行時間確認

長時間実行されているプロセス

# 実行時間順にソート
ps aux --sort=-time | head -10

# 1日以上実行されているプロセス
ps -eo pid,user,cmd,etime | grep -E " [0-9]+-"

ゾンビプロセスの確認

ゾンビプロセスの検出

# ゾンビプロセスを検索
ps aux | grep -E " Z | <defunct>"

# ゾンビプロセス数をカウント
ps aux | awk '$8 ~ /^Z/ {count++} END {print "Zombie processes:", count+0}'

プロセス監視の自動化

スクリプトでの定期監視

CPU使用率監視スクリプト

#!/bin/bash
# high_cpu_monitor.sh

THRESHOLD=80
LOGFILE="/var/log/high_cpu.log"

while true; do
    HIGH_CPU=$(ps aux --no-headers | awk -v threshold=$THRESHOLD '$3 > threshold {print $0}')
    
    if [ -n "$HIGH_CPU" ]; then
        echo "$(date): High CPU usage detected" >> $LOGFILE
        echo "$HIGH_CPU" >> $LOGFILE
        echo "---" >> $LOGFILE
    fi
    
    sleep 60
done

メモリ使用量監視スクリプト

#!/bin/bash
# memory_monitor.sh

THRESHOLD=80
EMAIL="admin@example.com"

MEMORY_USAGE=$(free | awk '/Mem:/ {printf "%.2f", $3/$2 * 100}')

if (( $(echo "$MEMORY_USAGE > $THRESHOLD" | bc -l) )); then
    echo "Memory usage is ${MEMORY_USAGE}% (threshold: ${THRESHOLD}%)" | \
    mail -s "High Memory Usage Alert" $EMAIL
fi

cronでの定期実行

crontab設定例

# crontab -e で編集
# 5分ごとにCPU監視
*/5 * * * * /path/to/high_cpu_monitor.sh

# 毎時メモリ使用量をチェック
0 * * * * /path/to/memory_monitor.sh

# 毎日のプロセス状況をログ保存
0 0 * * * ps aux > /var/log/daily_processes_$(date +\%Y\%m\%d).log

トラブルシューティング

よくある問題と対処法

Q:プロセスが終了しない

A:段階的に終了を試してください

# 1. 通常終了(SIGTERM)
kill PID

# 2. 少し強め(SIGINT)
kill -2 PID

# 3. 強制終了(SIGKILL)
kill -9 PID

Q:システムが重い原因を調べたい

A:以下の順序で確認してください

# 1. 全体的な負荷確認
top
uptime

# 2. CPU使用率の高いプロセス
ps aux --sort=-%cpu | head -5

# 3. メモリ使用量の確認
free -h
ps aux --sort=-%mem | head -5

# 4. ディスクI/O確認
iostat 1 5

Q:特定のポートが使用中かわからない

A:lsofやnetstatで確認してください

# ポート使用状況確認
lsof -i :8080
netstat -tulpn | grep :8080
ss -tulpn | grep :8080

Q:プロセス数が多すぎる

A:プロセス数制限を確認してください

# 現在のプロセス数
ps aux | wc -l

# ユーザー別プロセス数
ps aux | awk '{print $1}' | sort | uniq -c | sort -nr

# プロセス数制限確認
ulimit -u

よくある質問

Q:psとtopの使い分けは?

A:以下のように使い分けてください

  • ps:スナップショット確認、スクリプト処理
  • top:リアルタイム監視、負荷調査
  • htop:視覚的な確認、対話操作

Q:デーモンプロセスを確認するには?

A:以下の方法が効果的です

# systemd管理サービス
systemctl list-units --type=service

# 全デーモンプロセス
ps aux | grep -v "^\[" | grep -E "\s+\?\s+"

# init.dスクリプト(古いシステム)
service --status-all

Q:プロセスの親子関係を調べるには?

A:以下のコマンドが便利です

# プロセスツリー表示
pstree -p

# 特定プロセスの親子関係
ps -o pid,ppid,cmd PID

# 子プロセス一覧
ps --ppid PARENT_PID

Q:メモリリークを疑うプロセスの調査方法は?

A:時系列でメモリ使用量を監視してください

# 特定プロセスの継続監視
watch -n 5 "ps -p PID -o pid,vsz,rss,cmd"

# メモリマップの詳細確認
cat /proc/PID/smaps
pmap PID

まとめ:効果的なプロセス管理をマスターしよう

この記事のポイント

用途コマンド特徴
基本確認ps auxスナップショット表示
リアルタイム監視top または htop動的な負荷確認
PID取得pgrep特定プロセスの検索
サービス状況systemctl statussystemd管理サービス
ポート使用lsof -i :PORTネットワーク関連

プロセス管理の基本フロー

  1. 全体確認ps auxまたはtopで現状把握
  2. 問題特定:CPU・メモリ使用率でソート
  3. 詳細調査lsofやプロセス詳細情報で原因分析
  4. 対処実行:適切な方法でプロセス制御

効率的な監視のコツ

  • 定期監視:cronでの自動チェック
  • 閾値設定:アラート条件の明確化
  • ログ保存:トラブル時の調査材料
  • スクリプト化:繰り返し作業の自動化

安全なプロセス操作

  • 段階的終了:SIGTERM → SIGKILL の順序
  • 影響範囲確認:依存関係の把握
  • バックアップ:重要なサービスは事前準備
  • 監視継続:操作後の状況確認

Linuxで動いているプロセスを確認する技術をマスターすれば、ps auxで全プロセスのスナップショットを確認、topでリアルタイムで負荷を監視、pgrepで特定の名前を持つプロセスのPIDを取得、htopで視覚的にプロセスをチェックという使い分けで、CPUを食っているプロセスや止まっているデーモンを素早く見つけて対応できます。

コメント

タイトルとURLをコピーしました