「サーバーが重い…誰が大量のプロセスを動かしてるんだろう?」
「自分がどれだけプロセスを起動しているか知りたい!」
Linux や Mac のサーバーを運用していると、システムリソースの使用状況を把握する必要がありますよね。
特に複数のユーザーが使う環境では、ユーザーごとにどれだけのプロセスが動いているかを確認することが、トラブルシューティングやリソース管理の第一歩になります。
この記事では、ターミナルでユーザー別のプロセス数を確認する様々な方法を、初心者の方にも分かりやすく解説していきます!
プロセスとは?基礎知識
プロセスの概念
プロセスとは、実行中のプログラムのことです。
身近な例:
- ブラウザを開く → ブラウザのプロセスが起動
- 音楽を再生 → 音楽プレイヤーのプロセスが起動
- コマンドを実行 → そのコマンドのプロセスが起動
一つのプログラムでも、複数のプロセスを生成することがあります。
PID(プロセスID)
各プロセスには、システムが割り当てる一意の番号(PID)があります。
# 例
PID USER COMMAND
1234 user1 bash
1235 user1 python script.py
1236 user2 nginx
PIDは、プロセスを識別・操作するために使われます。
ユーザーとプロセス
各プロセスは、特定のユーザーの権限で実行されます。
重要なユーザー:
- root:システム管理者、全ての権限
- 一般ユーザー:自分のファイルやプロセスのみ操作可能
- システムユーザー:www-data、mysql など、特定のサービス用
最も簡単な確認方法
ps コマンドの基本
最も一般的なプロセス確認コマンドです。
現在のユーザーのプロセス数:
ps -u $(whoami) | wc -l
出力例:
25
現在のユーザーが25個のプロセスを実行中という意味です。
解説:
ps -u $(whoami)
:現在のユーザーのプロセス一覧wc -l
:行数をカウント(= プロセス数)- ヘッダー行も含むため、実際のプロセス数は1少ない
特定ユーザーのプロセス数
ps -u ユーザー名 | wc -l
例:
ps -u user1 | wc -l
# 出力:15
ps -u apache | wc -l
# 出力:8
全ユーザーのプロセス数を一覧表示
方法1:ps + awk(シンプル)
最も手軽な方法です。
ps aux | awk '{print $1}' | sort | uniq -c | sort -rn
出力例:
150 root
45 user1
32 www-data
18 mysql
12 user2
8 postgres
解説:
ps aux
:全プロセスを表示awk '{print $1}'
:ユーザー名(1列目)を抽出sort
:ソートuniq -c
:重複をカウントsort -rn
:数値で降順ソート
方法2:ps + cut + sort(読みやすい)
ps -eo user | sort | uniq -c | sort -rn
出力例:
150 root
45 user1
32 www-data
18 mysql
12 user2
解説:
ps -eo user
:ユーザー名のみ表示- より簡潔で効率的
方法3:pgrep コマンド
ユーザー名を指定してカウントできます。
pgrep -u ユーザー名 | wc -l
全ユーザーを一括確認:
for user in $(cut -d: -f1 /etc/passwd); do
count=$(pgrep -u "$user" 2>/dev/null | wc -l)
if [ $count -gt 0 ]; then
echo "$user: $count"
fi
done | sort -t: -k2 -rn
出力例:
root: 150
user1: 45
www-data: 32
mysql: 18
より詳細な情報を表示
ps コマンドの詳細表示
プロセス数だけでなく、詳細な情報も確認できます。
ヘッダー付きで見やすく:
ps aux | awk 'NR==1 {print; next} {users[$1]++} END {for (u in users) print u, users[u]}' | column -t
ユーザー別のCPU・メモリ使用率も表示:
ps aux | awk 'NR>1 {cpu[$1]+=$3; mem[$1]+=$4; count[$1]++} END {for (u in count) printf "%-15s %5d プロセス CPU: %6.2f%% MEM: %6.2f%%\n", u, count[u], cpu[u], mem[u]}'
出力例:
root 150 プロセス CPU: 15.30% MEM: 25.40%
user1 45 プロセス CPU: 8.20% MEM: 12.10%
www-data 32 プロセス CPU: 3.50% MEM: 8.30%
top コマンドでリアルタイム確認
topでユーザー別に表示:
top -u ユーザー名
例:
top -u user1
user1のプロセスのみがリアルタイムで表示されます。
top内でのソート:
Shift + M
:メモリ使用量でソートShift + P
:CPU使用率でソートu
:特定ユーザーでフィルタ
システム全体のプロセス統計
プロセス総数の確認
ps aux | wc -l
# または
ps -e | wc -l
実行中のプロセスの詳細:
ps -eo user,pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -20
出力例:
USER PID PPID %CPU %MEM CMD
root 1234 1 15.3 8.2 /usr/bin/mysqld
user1 5678 1234 12.1 5.4 python3 app.py
www-data 9012 1000 8.5 3.2 nginx: worker process
システムリソースの概要
# CPUコア数
nproc
# メモリ情報
free -h
# 負荷平均
uptime
# 詳細なシステム情報
cat /proc/loadavg
htop で視覚的に確認
htop のインストール
より使いやすいプロセスモニターです。
Ubuntu/Debian:
sudo apt install htop
CentOS/RHEL/AlmaLinux:
sudo dnf install htop
Mac(Homebrew):
brew install htop
htop の使い方
起動:
htop
便利な操作:
F4
:ユーザー名でフィルタF5
:ツリー表示(親子関係を表示)F6
:ソート項目の変更F9
:プロセスのkillu
:ユーザー選択
ユーザー別にフィルタ:
- htopを起動
F4
キーを押す- ユーザー名を入力
- そのユーザーのプロセスのみ表示
スクリプトで自動化
シェルスクリプト例1:基本的なカウント
#!/bin/bash
# user_process_count.sh
echo "=== ユーザー別プロセス数 ==="
echo "USER PROCESSES"
echo "=========================="
ps -eo user | sort | uniq -c | sort -rn | while read count user; do
printf "%-15s %5d\n" "$user" "$count"
done
実行方法:
chmod +x user_process_count.sh
./user_process_count.sh
シェルスクリプト例2:詳細版
#!/bin/bash
# detailed_user_stats.sh
echo "=== ユーザー別プロセス統計 ==="
printf "%-15s %10s %10s %10s\n" "USER" "PROCESSES" "CPU%" "MEM%"
echo "=================================================="
ps aux | awk 'NR>1 {
count[$1]++
cpu[$1]+=$3
mem[$1]+=$4
}
END {
for (u in count) {
printf "%-15s %10d %9.2f%% %9.2f%%\n", u, count[u], cpu[u], mem[u]
}
}' | sort -k2 -rn
Python スクリプト例
#!/usr/bin/env python3
# user_process_stats.py
import subprocess
import collections
def get_user_process_count():
# psコマンドの実行
result = subprocess.run(
['ps', '-eo', 'user'],
capture_output=True,
text=True
)
# ヘッダー行を除外
users = result.stdout.strip().split('\n')[1:]
# カウント
user_count = collections.Counter(users)
# 結果を表示
print("=== ユーザー別プロセス数 ===")
print(f"{'USER':<15} {'PROCESSES':>10}")
print("=" * 30)
for user, count in user_count.most_common():
print(f"{user:<15} {count:>10}")
print(f"\n総プロセス数: {sum(user_count.values())}")
if __name__ == "__main__":
get_user_process_stats()
実行方法:
chmod +x user_process_stats.py
./user_process_stats.py
プロセス数の制限確認
ulimit でユーザーの制限を確認
各ユーザーが起動できるプロセス数には上限があります。
現在の制限を確認:
ulimit -u
出力例:
7823
このユーザーは最大7,823個のプロセスを起動できます。
全ての制限を確認:
ulimit -a
出力例:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
システム全体の制限
# 最大プロセス数
cat /proc/sys/kernel/pid_max
# 出力例:32768
実践的な使用例
ケース1:プロセス数が多すぎるユーザーを特定
# 100個以上のプロセスを持つユーザーを表示
ps -eo user | sort | uniq -c | sort -rn | awk '$1 > 100 {print $2 ": " $1 " プロセス"}'
出力例:
root: 150 プロセス
user1: 120 プロセス
ケース2:特定ユーザーのプロセス詳細
# user1のプロセスを詳しく表示
ps -u user1 -o pid,ppid,%cpu,%mem,cmd --sort=-%cpu
出力例:
PID PPID %CPU %MEM CMD
5678 1234 12.1 5.4 python3 app.py
5679 5678 8.3 3.2 /usr/bin/node server.js
5680 1234 2.1 1.8 bash
ケース3:プロセス数の推移をモニタリング
# 10秒ごとにユーザー別プロセス数を表示
watch -n 10 'ps -eo user | sort | uniq -c | sort -rn'
リアルタイムで変化を追跡できます。
ケース4:ログファイルに記録
#!/bin/bash
# process_monitor.sh
LOGFILE="/var/log/process_count.log"
while true; do
echo "=== $(date) ===" >> "$LOGFILE"
ps -eo user | sort | uniq -c | sort -rn >> "$LOGFILE"
echo "" >> "$LOGFILE"
sleep 300 # 5分ごと
done
プロセスの管理と制御
プロセスの終了
特定ユーザーのプロセスを全て終了(注意!):
# 慎重に使用してください
sudo pkill -u ユーザー名
確認してから終了:
# まず確認
ps -u ユーザー名
# 問題なければ終了
sudo pkill -u ユーザー名
特定のプロセスのみ終了
# プロセス名で終了
pkill プロセス名
# PIDで終了
kill PID番号
# 強制終了
kill -9 PID番号
プロセス数の制限設定
/etc/security/limits.conf で設定:
sudo vi /etc/security/limits.conf
追加する設定例:
# ユーザー名 種類 項目 値
user1 soft nproc 1000
user1 hard nproc 2000
* soft nproc 500
* hard nproc 1000
- soft:通常の制限
- hard:絶対的な上限
トラブルシューティング
問題1:「fork: retry: Resource temporarily unavailable」
原因:
プロセス数の上限に達している
確認:
# 現在のプロセス数
ps -u $(whoami) | wc -l
# 上限
ulimit -u
対処法:
- 不要なプロセスを終了
- 管理者に上限の引き上げを依頼
問題2:特定ユーザーのプロセスが見えない
原因:
権限不足
対処法:
# 自分のプロセスのみ見える(一般ユーザー)
ps -u $(whoami)
# 全ユーザーのプロセスを見る(要sudo)
sudo ps aux
問題3:プロセス数が異常に多い
原因:
- プロセスリークバグ
- フォークボム(悪意あるスクリプト)
- 正常な高負荷状態
対処法:
# 何のプロセスが多いか確認
ps -u ユーザー名 -o cmd | sort | uniq -c | sort -rn | head
# 必要に応じて終了
sudo pkill -u ユーザー名 プロセス名
システム監視ツール
nmon(詳細なシステムモニター)
# インストール
sudo apt install nmon # Ubuntu/Debian
sudo dnf install nmon # CentOS/RHEL
# 実行
nmon
プロセス、CPU、メモリ、ディスクなど総合的に監視できます。
glances(現代的なモニター)
# インストール
pip install glances
# 実行
glances
美しいUIでシステム情報を表示します。
atop(高度な分析)
# インストール
sudo apt install atop
# 実行
atop
過去のデータも保存・分析できます。
よくある質問
Q1. rootのプロセス数が多いのは正常?
はい、正常です。
システムサービスの多くはrootで動作するため、プロセス数が最も多くなります。
Q2. プロセス数の目安は?
一般ユーザー:
- 通常:10~50個
- 開発環境:50~200個
システムユーザー:
- Webサーバー:20~100個
- データベース:10~50個
Q3. プロセスとスレッドの違いは?
プロセス:
独立したメモリ空間を持つ実行単位
スレッド:
プロセス内の実行単位、メモリを共有
ps
コマンドでは通常、軽量プロセス(LWP = スレッド)もカウントされます。
Q4. ゾンビプロセスとは?
終了したが親プロセスに回収されていないプロセスです。
確認方法:
ps aux | grep defunct
通常は無害ですが、大量にあると問題です。
Q5. 1ユーザーの適切なプロセス数制限は?
一般的な設定:
- 開発サーバー:1,000~5,000
- 本番サーバー:500~2,000
- 共用サーバー:100~500
用途に応じて調整してください。
まとめ:プロセス管理でシステムを健全に保つ
ユーザー別のプロセス数確認方法について、基礎から実践まで解説してきました。
重要ポイントのおさらい:
- ps コマンドが基本
ps -eo user | sort | uniq -c
で簡単にカウント - htop で視覚的に確認
リアルタイムで見やすい - スクリプトで自動化
定期的な監視や記録に便利 - ulimit で制限を確認
プロセス数の上限を把握する - 異常値に注意
急激な増加はトラブルのサイン
プロセス管理は、システムの健全性を保つために欠かせません。この記事を参考に、効率的なシステム監視を実現してくださいね!
コメント