ターミナルでユーザー別のプロセス数を確認する方法【Linux/Mac完全ガイド】

プログラミング・IT

「サーバーが重い…誰が大量のプロセスを動かしてるんだろう?」
「自分がどれだけプロセスを起動しているか知りたい!」

Linux や Mac のサーバーを運用していると、システムリソースの使用状況を把握する必要がありますよね。

特に複数のユーザーが使う環境では、ユーザーごとにどれだけのプロセスが動いているかを確認することが、トラブルシューティングやリソース管理の第一歩になります。

この記事では、ターミナルでユーザー別のプロセス数を確認する様々な方法を、初心者の方にも分かりやすく解説していきます!


スポンサーリンク
  1. プロセスとは?基礎知識
    1. プロセスの概念
    2. PID(プロセスID)
    3. ユーザーとプロセス
  2. 最も簡単な確認方法
    1. ps コマンドの基本
    2. 特定ユーザーのプロセス数
  3. 全ユーザーのプロセス数を一覧表示
    1. 方法1:ps + awk(シンプル)
    2. 方法2:ps + cut + sort(読みやすい)
    3. 方法3:pgrep コマンド
  4. より詳細な情報を表示
    1. ps コマンドの詳細表示
    2. top コマンドでリアルタイム確認
  5. システム全体のプロセス統計
    1. プロセス総数の確認
    2. システムリソースの概要
  6. htop で視覚的に確認
    1. htop のインストール
    2. htop の使い方
  7. スクリプトで自動化
    1. シェルスクリプト例1:基本的なカウント
    2. シェルスクリプト例2:詳細版
    3. Python スクリプト例
  8. プロセス数の制限確認
    1. ulimit でユーザーの制限を確認
    2. システム全体の制限
  9. 実践的な使用例
    1. ケース1:プロセス数が多すぎるユーザーを特定
    2. ケース2:特定ユーザーのプロセス詳細
    3. ケース3:プロセス数の推移をモニタリング
    4. ケース4:ログファイルに記録
  10. プロセスの管理と制御
    1. プロセスの終了
    2. 特定のプロセスのみ終了
    3. プロセス数の制限設定
  11. トラブルシューティング
    1. 問題1:「fork: retry: Resource temporarily unavailable」
    2. 問題2:特定ユーザーのプロセスが見えない
    3. 問題3:プロセス数が異常に多い
  12. システム監視ツール
    1. nmon(詳細なシステムモニター)
    2. glances(現代的なモニター)
    3. atop(高度な分析)
  13. よくある質問
    1. Q1. rootのプロセス数が多いのは正常?
    2. Q2. プロセス数の目安は?
    3. Q3. プロセスとスレッドの違いは?
    4. Q4. ゾンビプロセスとは?
    5. Q5. 1ユーザーの適切なプロセス数制限は?
  14. まとめ:プロセス管理でシステムを健全に保つ

プロセスとは?基礎知識

プロセスの概念

プロセスとは、実行中のプログラムのことです。

身近な例:

  • ブラウザを開く → ブラウザのプロセスが起動
  • 音楽を再生 → 音楽プレイヤーのプロセスが起動
  • コマンドを実行 → そのコマンドのプロセスが起動

一つのプログラムでも、複数のプロセスを生成することがあります。

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:プロセスのkill
  • u:ユーザー選択

ユーザー別にフィルタ:

  1. htopを起動
  2. F4キーを押す
  3. ユーザー名を入力
  4. そのユーザーのプロセスのみ表示

スクリプトで自動化

シェルスクリプト例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

用途に応じて調整してください。


まとめ:プロセス管理でシステムを健全に保つ

ユーザー別のプロセス数確認方法について、基礎から実践まで解説してきました。

重要ポイントのおさらい:

  1. ps コマンドが基本
    ps -eo user | sort | uniq -c で簡単にカウント
  2. htop で視覚的に確認
    リアルタイムで見やすい
  3. スクリプトで自動化
    定期的な監視や記録に便利
  4. ulimit で制限を確認
    プロセス数の上限を把握する
  5. 異常値に注意
    急激な増加はトラブルのサイン

プロセス管理は、システムの健全性を保つために欠かせません。この記事を参考に、効率的なシステム監視を実現してくださいね!

コメント

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