プロセスとは

プロセスは、実行中のプログラムのインスタンスです。各プロセスには固有のID(PID)が割り当てられます。

プロセスの種類

  • フォアグラウンドプロセス: ターミナルに結びついて実行
  • バックグラウンドプロセス: ターミナルから独立して実行
  • デーモン: システムサービスとして常駐

psコマンド - プロセス一覧表示

基本的な使い方

# 現在のターミナルのプロセス
ps

# すべてのプロセス(詳細)
ps aux

# プロセスツリー表示
ps auxf

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

ps auxの出力

USER  PID %CPU %MEM    VSZ   RSS TTY STAT START   TIME COMMAND
root    1  0.0  0.1 169416 13804 ?   Ss   10:00   0:01 /sbin/init

各列の意味

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

プロセス状態(STAT)

  • R: Running(実行中)
  • S: Sleeping(待機中)
  • D: Uninterruptible sleep(中断不可)
  • Z: Zombie(ゾンビプロセス)
  • T: Stopped(停止)
  • s: セッションリーダー
  • +: フォアグラウンド
  • <: 高優先度

便利なpsコマンド

# CPU使用率トップ10
ps aux --sort=-%cpu | head -11

# メモリ使用率トップ10
ps aux --sort=-%mem | head -11

# 特定のコマンドを検索
ps aux | grep nginx

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

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

基本的な使い方

# リアルタイムプロセス監視
top

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

# 更新間隔を変更(秒)
top -d 2

top内でのキー操作

  • h: ヘルプ表示
  • q: 終了
  • k: プロセスをキル
  • M: メモリ使用量でソート
  • P: CPU使用量でソート
  • 1: 各CPUコアを表示
  • c: フルコマンドパス表示
  • u: 特定ユーザーでフィルタ

htop(改良版top)

# インストール
sudo apt install htop

# 実行
htop

htopの利点

  • ✅ カラフルで見やすい
  • ✅ マウス操作可能
  • ✅ CPU/メモリのバーグラフ
  • ✅ プロセスツリー表示
  • ✅ 検索・フィルタ機能

killコマンド - プロセス終了

基本的な使い方

# プロセスIDを指定して終了
kill PID

# 複数のプロセスを終了
kill PID1 PID2 PID3

# プロセス名で終了
killall process_name

シグナルの種類

# シグナル一覧表示
kill -l

主要なシグナル

  • SIGTERM (15): 正常終了(デフォルト)
  • SIGKILL (9): 強制終了(推奨されない)
  • SIGHUP (1): 再起動(設定ファイル再読み込み)
  • SIGSTOP (19): 一時停止
  • SIGCONT (18): 再開

シグナルの送信

# 正常終了(推奨)
kill -15 PID
kill -TERM PID

# 強制終了(最終手段)
kill -9 PID
kill -KILL PID

# 再起動シグナル
kill -HUP PID
kill -1 PID

pkillとpgrepコマンド

# プロセス名で終了
pkill nginx

# 正規表現で検索して終了
pkill -f "python.*server"

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

# 詳細表示
pgrep -a nginx

バックグラウンド実行

コマンドをバックグラウンドで実行

# &を付けてバックグラウンド実行
long_running_command &

# ジョブ一覧表示
jobs

# フォアグラウンドに戻す
fg %1

# バックグラウンドに送る(Ctrl+Z後)
bg %1

nohupコマンド

ターミナルを閉じてもプロセスが継続します。

# nohupで実行
nohup python server.py &

# 出力はnohup.outに保存される
tail -f nohup.out

screenとtmux

# screen セッション開始
screen -S mysession
# Ctrl+A, D でデタッチ
# 再接続
screen -r mysession

# tmux セッション開始
tmux new -s mysession
# Ctrl+B, D でデタッチ
# 再接続
tmux attach -t mysession

systemctlコマンド - サービス管理

基本的な操作

# サービスの開始
sudo systemctl start nginx

# サービスの停止
sudo systemctl stop nginx

# サービスの再起動
sudo systemctl restart nginx

# 設定の再読み込み(再起動なし)
sudo systemctl reload nginx

# 状態確認
sudo systemctl status nginx

自動起動の設定

# 自動起動を有効化
sudo systemctl enable nginx

# 自動起動を無効化
sudo systemctl disable nginx

# 自動起動の状態確認
sudo systemctl is-enabled nginx

サービス一覧

# すべてのサービス
systemctl list-units --type=service

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

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

ログ表示(journalctl)

# サービスのログ表示
sudo journalctl -u nginx

# リアルタイムでログ表示
sudo journalctl -u nginx -f

# 最新100行
sudo journalctl -u nginx -n 100

# 今日のログ
sudo journalctl -u nginx --since today

リソース使用量の監視

CPU使用率の確認

# CPU情報
lscpu

# 負荷平均
uptime
w

# 詳細なCPU統計
mpstat 1

メモリ使用量

# メモリ使用状況
free -h

# より詳細に
cat /proc/meminfo

# メモリ使用量トップ5
ps aux --sort=-%mem | head -6

ディスクI/O

# ディスクI/O統計
iostat -x 1

# プロセスごとのI/O
sudo iotop

プロセス優先度の変更

nice値(-20〜19)

  • -20: 最高優先度
  • 0: デフォルト
  • 19: 最低優先度

niceコマンド

# 低優先度で実行
nice -n 10 ./heavy_process.sh

# 高優先度で実行(root権限必要)
sudo nice -n -10 ./important_process.sh

reniceコマンド

# 実行中プロセスの優先度変更
renice -n 5 -p PID

# ユーザーのすべてのプロセス
renice -n 10 -u username

実用例

例1: 暴走プロセスの停止

# CPU使用率が高いプロセスを特定
top
# または
ps aux --sort=-%cpu | head -10

# プロセスIDを確認してキル
kill -15 PID

# 応答しない場合は強制終了
kill -9 PID

例2: メモリリークの調査

# メモリ使用量の監視
watch -n 1 'ps aux --sort=-%mem | head -10'

# 特定プロセスのメモリ使用量推移
while true; do
    ps -p PID -o pid,%mem,vsz,rss,cmd
    sleep 5
done

例3: Webサーバーの再起動

# Nginxの再起動(ダウンタイムなし)
sudo systemctl reload nginx

# 設定テスト後に再起動
sudo nginx -t && sudo systemctl reload nginx

# ログ確認
sudo journalctl -u nginx -n 50

例4: ゾンビプロセスの処理

# ゾンビプロセスの検索
ps aux | grep 'Z'

# 親プロセスを終了させる
kill -9 PPID

トラブルシューティング

プロセスが終了しない

# 1. まず正常終了を試す
kill -15 PID

# 2. 待っても終了しない場合
kill -9 PID

# 3. 親プロセスごと終了
pkill -9 -P PPID

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

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

# または
sudo netstat -tulpn | grep :80

# 終了
sudo kill $(sudo lsof -t -i:80)

CPU 100%の原因調査

# CPU使用率トップ
top
# Pキーでソート

# strace でシステムコールを追跡
sudo strace -p PID

# プロセスのスタックトレース
sudo cat /proc/PID/stack

監視スクリプト例

リソース監視スクリプト

#!/bin/bash

THRESHOLD_CPU=80
THRESHOLD_MEM=90

while true; do
    # CPU使用率チェック
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    
    if (( $(echo "$cpu_usage > $THRESHOLD_CPU" | bc -l) )); then
        echo "[ALERT] CPU使用率が高い: ${cpu_usage}%"
        ps aux --sort=-%cpu | head -5
    fi
    
    # メモリ使用率チェック
    mem_usage=$(free | grep Mem | awk '{print ($3/$2) * 100.0}')
    
    if (( $(echo "$mem_usage > $THRESHOLD_MEM" | bc -l) )); then
        echo "[ALERT] メモリ使用率が高い: ${mem_usage}%"
        ps aux --sort=-%mem | head -5
    fi
    
    sleep 60
done

まとめ

プロセス管理はLinuxシステム管理の基本スキルです。

重要コマンド

  • ps aux: プロセス一覧
  • top/htop: リアルタイム監視
  • kill: プロセス終了
  • systemctl: サービス管理
  • journalctl: ログ確認

ベストプラクティス

  • kill -9は最終手段(まずは-15を試す)
  • 定期的なリソース監視
  • ログの確認習慣
  • 適切な優先度設定