Linuxサーバーや開発環境で作業しているとき「今このマシンでどんなプロセスが動いているのか?」「CPUを大量に消費しているプロセスは?」「特定のサービスが正常に動いているか?」を知りたい場面はよくあります。
こんな場面で必要になります
- CPUやメモリ負荷の調査
- デーモンサービスの動作確認
- 異常なプロセスの特定と停止
- システムパフォーマンスの監視
- セキュリティインシデントの調査
- アプリケーションのトラブルシューティング
プロセス管理はLinux運用の基本中の基本です。適切にプロセスを監視できれば、システムの問題を早期発見して対処できます。
この記事では、Linuxで現在動いているプロセスを確認するための基本的なコマンドを、具体的な例を交えて初心者にもわかりやすく解説します。
これを読めば、Linuxシステムの状況を的確に把握できるようになりますよ!
プロセスとは?基本概念の理解

プロセスの基本
プロセスとは、実行中のプログラムのことです。Linuxシステムでは、起動したプログラムはそれぞれ独立したプロセスとして管理されます。
プロセスの主要な特徴
- PID(Process ID):各プロセスに割り当てられる一意の番号
- PPID(Parent PID):親プロセスのPID
- 状態:実行中、停止中、ゾンビなど
- リソース使用量:CPU、メモリ、ファイルディスクリプタなど
プロセスの種類
フォアグラウンドプロセス
- ターミナルから直接実行されるプロセス
- 終了するまでターミナルを占有
- 例:
vi editor.txt
、make
バックグラウンドプロセス
- ターミナルを占有せずに実行されるプロセス
&
をつけてバックグラウンド実行- 例:
firefox &
デーモンプロセス
- システム起動時から継続して動作
- バックグラウンドでサービスを提供
- 例:
sshd
、nginx
、mysqld
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の特徴
htop
はtop
の改良版で、より直感的で使いやすいインターフェースを提供します。
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 status | systemd管理サービス |
ポート使用 | lsof -i :PORT | ネットワーク関連 |
プロセス管理の基本フロー
- 全体確認:
ps aux
またはtop
で現状把握 - 問題特定:CPU・メモリ使用率でソート
- 詳細調査:
lsof
やプロセス詳細情報で原因分析 - 対処実行:適切な方法でプロセス制御
効率的な監視のコツ
- 定期監視:cronでの自動チェック
- 閾値設定:アラート条件の明確化
- ログ保存:トラブル時の調査材料
- スクリプト化:繰り返し作業の自動化
安全なプロセス操作
- 段階的終了:SIGTERM → SIGKILL の順序
- 影響範囲確認:依存関係の把握
- バックアップ:重要なサービスは事前準備
- 監視継続:操作後の状況確認
Linuxで動いているプロセスを確認する技術をマスターすれば、ps aux
で全プロセスのスナップショットを確認、top
でリアルタイムで負荷を監視、pgrep
で特定の名前を持つプロセスのPIDを取得、htop
で視覚的にプロセスをチェックという使い分けで、CPUを食っているプロセスや止まっているデーモンを素早く見つけて対応できます。
コメント