Linuxサーバーを運用していると、「あのプロセスがCPUを占有している」「サービスが応答しない」といった場面に必ず遭遇します。こうしたトラブルに迅速に対処するには、プロセスの確認・制御・サービス管理の基本操作を理解しておくことが不可欠です。
本記事では、Linuxのプロセス管理に欠かせないps・top・kill・systemctlの4つのコマンドを中心に、IT担当者やエンジニアが実務で使える知識を体系的に解説します。「Linuxとは何か」を理解した方が、次のステップとしてプロセス管理を習得するのに最適な内容です。
Linuxにおけるプロセスとは?基本概念を理解する
プロセス管理を学ぶ前に、まず「プロセスとは何か」を正確に理解しましょう。Linuxにおけるプロセスの仕組みを知ることで、以降のコマンド操作がスムーズに理解できるようになります。
プロセスの定義とプログラムとの違い
プロセスとは、実行中のプログラムのインスタンスです。ディスク上に保存されている実行ファイル(プログラム)がメモリに読み込まれ、CPUによって処理されている状態をプロセスと呼びます。
例えば、同じWebサーバープログラム(nginx)でも、複数のワーカープロセスとして同時に動作することがあります。プログラムは1つでも、プロセスは複数存在しうるという点が重要です。
PID(プロセスID)とPPID(親プロセスID)
Linuxでは、すべてのプロセスに一意の番号であるPID(Process ID)が割り当てられます。また、各プロセスは他のプロセスから生成されるため、生成元の親プロセスを示すPPID(Parent Process ID)も持ちます。
システム起動時に最初に起動されるプロセスはsystemd(PID 1)で、他のすべてのプロセスはこのsystemdから直接的・間接的に生成されます。この親子関係はツリー構造になっており、pstreeコマンドで視覚的に確認できます。
$ pstree -p | head -20
systemd(1)─┬─ModemManager(892)─┬─{ModemManager}(920)
│ └─{ModemManager}(923)
├─NetworkManager(862)─┬─{NetworkManager}(940)
│ └─{NetworkManager}(942)
├─sshd(1035)───sshd(5421)───bash(5423)───pstree(5450)
プロセスの状態(ステート)
Linuxのプロセスは、常にいずれかの状態にあります。主な状態は以下のとおりです。
| 状態 | 記号 | 説明 |
|---|---|---|
| 実行中(Running) | R | CPUで実行中、または実行待ちキューに入っている |
| スリープ(Sleeping) | S | I/O待ちなどで一時停止中(割り込み可能) |
| ディスクスリープ | D | I/O待ちで一時停止中(割り込み不可) |
| 停止(Stopped) | T | シグナルにより停止中 |
| ゾンビ(Zombie) | Z | 終了済みだが親プロセスが回収していない |
特に注意が必要なのがゾンビプロセスです。ゾンビプロセスはリソースをほとんど消費しませんが、大量に発生するとPIDが枯渇し、新しいプロセスを起動できなくなる可能性があります。
psコマンドでプロセスを一覧表示する
psコマンドは、現在のプロセス状態のスナップショットを表示するコマンドです。リアルタイム監視ではなく、実行した瞬間のプロセス情報を取得する場合に使います。
よく使うpsコマンドのオプション
psコマンドにはBSD形式とUNIX形式の2系統のオプションがあります。実務では以下の組み合わせが頻繁に使われます。
# BSD形式:全プロセスを詳細表示
$ ps aux
# UNIX形式:全プロセスをフルフォーマットで表示
$ ps -ef
# 特定のプロセスを検索(grepとの組み合わせ)
$ ps aux | grep nginx
# ツリー表示で親子関係を確認
$ ps auxf
ps auxの出力に含まれる主要なカラムの意味は以下のとおりです。
| カラム | 説明 |
|---|---|
| USER | プロセスの実行ユーザー |
| PID | プロセスID |
| %CPU | CPU使用率 |
| %MEM | メモリ使用率 |
| VSZ | 仮想メモリサイズ(KB) |
| RSS | 物理メモリ使用量(KB) |
| STAT | プロセスの状態 |
| START | プロセスの開始時刻 |
| COMMAND | 実行コマンド |
実務でよく使うpsの活用パターン
実務では、単にps auxを実行するだけでなく、他のコマンドと組み合わせて使うケースがほとんどです。
# CPU使用率が高い順にソートして上位10件を表示
$ ps aux --sort=-%cpu | head -11
# メモリ使用率が高い順にソートして上位10件を表示
$ ps aux --sort=-%mem | head -11
# 特定ユーザーのプロセスだけを表示
$ ps -u www-data
# プロセス数をカウント
$ ps aux | wc -l
# 特定プロセスのPIDだけを取得(スクリプト用)
$ ps -C nginx -o pid=
これらのコマンドはLinuxコマンド一覧の中でも特に使用頻度が高く、サーバー運用では日常的に使う操作です。パフォーマンス監視の基本としても重要な位置づけにあります。
topコマンドでリアルタイム監視を行う
topコマンドは、プロセスの状態をリアルタイムで継続的に更新表示するコマンドです。psがスナップショットであるのに対し、topはライブモニタリングツールとして機能します。
topコマンドの画面構成
topを実行すると、画面上部にシステム全体のサマリー情報、下部にプロセス一覧が表示されます。
$ top
top - 14:30:15 up 45 days, 3:22, 2 users, load average: 0.52, 0.48, 0.41
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.1 id, 0.3 wa, 0.0 hi, 0.1 si
MiB Mem : 7948.4 total, 1234.5 free, 3456.7 used, 3257.2 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4123.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 www-data 20 0 512340 45678 12340 S 8.3 0.6 2:34.56 nginx
5678 mysql 20 0 1234560 234560 23456 S 3.2 2.9 15:23.45 mysqld
サマリー部分のload averageは特に重要です。3つの数値はそれぞれ1分・5分・15分間の平均負荷を表し、CPUコア数と比較して判断します。例えば4コアのサーバーでload averageが4.0であれば、CPU処理能力をフルに使用している状態です。
top実行中に使えるインタラクティブ操作
topコマンドは実行中にキーボード操作でさまざまな機能を利用できます。
| キー | 機能 |
|---|---|
| P | CPU使用率でソート |
| M | メモリ使用率でソート |
| T | 実行時間でソート |
| k | 指定PIDのプロセスにシグナル送信 |
| r | 指定PIDのnice値を変更 |
| u | 特定ユーザーのプロセスだけ表示 |
| c | コマンドラインのフルパス表示を切替 |
| 1 | CPUコア別の使用率表示を切替 |
| q | topを終了 |
htop:topの高機能版
標準のtopよりも視覚的にわかりやすいhtopも広く使われています。カラー表示、マウス操作対応、横スクロール、プロセスツリー表示などの機能があり、手動での監視作業に向いています。
# htopのインストール(Ubuntu/Debian)
$ sudo apt install htop
# htopのインストール(CentOS/Rocky Linux)
$ sudo dnf install htop
# 実行
$ htop
ただし、スクリプトからの自動処理や、リモートから軽量に確認したい場合は標準のtopのほうが適しています。用途に応じて使い分けましょう。
killコマンドでプロセスを制御する
プロセスの停止や再起動の指示を送るために使うのがkillコマンドです。名前は「kill(殺す)」ですが、実際にはプロセスにシグナルを送信するコマンドであり、停止以外の用途にも使えます。
主要なシグナルの種類
killコマンドで送信できるシグナルのうち、実務でよく使うものは以下のとおりです。
| シグナル番号 | 名前 | 説明 |
|---|---|---|
| 1 | SIGHUP | 設定ファイルの再読み込みを促す |
| 2 | SIGINT | 割り込み(Ctrl+Cと同等) |
| 9 | SIGKILL | 強制終了(プロセスは無視できない) |
| 15 | SIGTERM | 正常終了を要求(デフォルト) |
| 18 | SIGCONT | 停止中のプロセスを再開 |
| 19 | SIGSTOP | プロセスを一時停止(無視できない) |
killコマンドの基本的な使い方
# PIDを指定して正常終了シグナル(SIGTERM)を送信
$ kill 1234
# 強制終了シグナル(SIGKILL)を送信
$ kill -9 1234
# または
$ kill -KILL 1234
# 設定ファイルの再読み込みを促す
$ kill -HUP 1234
# シグナル一覧を表示
$ kill -l
重要なポイントとして、プロセスの停止はまずSIGTERM(15)を試み、それでも停止しない場合にのみSIGKILL(9)を使うようにしてください。SIGKILLはプロセスに後処理の機会を与えずに強制終了するため、データの不整合やファイルの破損を引き起こす可能性があります。
killall・pkill:名前指定でプロセスを制御する
PIDを調べてからkillするのは手間がかかるため、プロセス名で直接制御できるコマンドも用意されています。
# プロセス名で一括終了
$ killall nginx
# パターンマッチでプロセスを終了
$ pkill -f "python3 app.py"
# 特定ユーザーのプロセスだけを終了
$ pkill -u testuser
# 終了前にマッチするプロセスを確認(pgrepで確認してからpkill)
$ pgrep -a nginx
1234 nginx: master process
1235 nginx: worker process
$ pkill nginx
本番環境では、pgrepで対象プロセスを確認してからpkillを実行する習慣をつけましょう。誤って関係のないプロセスを停止してしまう事故を防げます。
systemctlでサービスを管理する
現代のLinuxディストリビューション(Ubuntu 16.04以降、CentOS 7以降、Rocky Linux等)では、サービスの管理にsystemdが使われています。systemdのフロントエンドコマンドであるsystemctlは、サービスの起動・停止・状態確認に必須のツールです。詳しい仕組みはsystemdとサービス管理の詳細ガイドでも解説しています。
サービスの基本操作
# サービスの状態確認
$ systemctl status nginx
# サービスの起動
$ sudo systemctl start nginx
# サービスの停止
$ sudo systemctl stop nginx
# サービスの再起動
$ sudo systemctl restart nginx
# 設定ファイルの再読み込み(サービスを停止せずに設定反映)
$ sudo systemctl reload nginx
# サービスの自動起動を有効化
$ sudo systemctl enable nginx
# サービスの自動起動を無効化
$ sudo systemctl disable nginx
# 自動起動の有効化と即時起動を同時に実行
$ sudo systemctl enable --now nginx
systemctl statusの読み方
systemctl statusの出力には重要な情報が多く含まれています。
$ systemctl status nginx
● 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 2026-03-20 10:15:30 JST; 2 days ago
Docs: man:nginx(8)
Process: 1230 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; (code=exited, status=0/SUCCESS)
Main PID: 1234 (nginx)
Tasks: 5 (limit: 9451)
Memory: 12.3M
CPU: 1min 23.456s
CGroup: /system.slice/nginx.service
├─1234 "nginx: master process /usr/sbin/nginx -g daemon on;"
├─1235 "nginx: worker process"
└─1236 "nginx: worker process"
ここで確認すべきポイントは次のとおりです。
- Loaded:ユニットファイルの場所と自動起動設定(enabled/disabled)
- Active:現在の動作状態と起動時刻
- Main PID:メインプロセスのPID
- Tasks:プロセスが使用しているタスク数
- Memory / CPU:リソース使用量
- CGroup:コントロールグループに属するプロセスの一覧
サービスの一覧表示と絞り込み
# 全サービスユニットの一覧表示
$ systemctl list-units --type=service
# 実行中のサービスのみ表示
$ systemctl list-units --type=service --state=running
# 自動起動が有効なサービスの一覧
$ systemctl list-unit-files --type=service --state=enabled
# 起動に失敗したサービスの確認
$ systemctl --failed
サーバーのトラブルシューティングでは、まずsystemctl --failedで失敗サービスを確認し、次にjournalctl -u サービス名でログを確認するのが基本的な流れです。ログ管理と合わせて覚えておくと、障害対応の効率が大きく向上します。
フォアグラウンドとバックグラウンドのジョブ制御
ターミナルで作業する際、コマンドの実行方法にはフォアグラウンド実行とバックグラウンド実行の2種類があります。長時間かかる処理を実行しながら別の作業を進めたい場合に、ジョブ制御の知識が役立ちます。
バックグラウンド実行の基本
# コマンドの末尾に&をつけてバックグラウンドで実行
$ ./backup.sh &
[1] 5678
# 実行中のジョブ一覧を表示
$ jobs
[1]+ Running ./backup.sh &
# バックグラウンドジョブをフォアグラウンドに戻す
$ fg %1
# フォアグラウンドの処理をバックグラウンドに移す
# まずCtrl+Zで一時停止してから
$ bg %1
nohupで端末切断後もプロセスを継続する
SSH接続でサーバーにログインして作業する場合、端末を切断するとバックグラウンドプロセスにもSIGHUPシグナルが送られ、プロセスが終了してしまいます。これを防ぐのがnohupコマンドです。
# nohupで端末切断後も処理を継続
$ nohup ./long-task.sh &
[1] 6789
nohup: ignoring input and appending output to 'nohup.out'
# 出力先を指定する場合
$ nohup ./long-task.sh > /var/log/task.log 2>&1 &
なお、より高度なセッション管理が必要な場合はtmuxやscreenの使用を検討してください。これらはSSH接続によるリモートサーバー管理とも密接に関連しています。
実務で役立つプロセス管理のテクニック
ここまで学んだ基本コマンドを組み合わせて、実務でよく遭遇するシナリオに対処する方法を紹介します。
CPU・メモリを大量消費するプロセスの特定と対処
# CPU使用率が高いプロセスのトップ5を特定
$ ps aux --sort=-%cpu | head -6
# メモリ使用量が多いプロセスのトップ5を特定
$ ps aux --sort=-%mem | head -6
# 特定プロセスの詳細情報を確認
$ cat /proc/1234/status
# プロセスの優先度を下げる(nice値を上げる)
$ sudo renice +10 -p 1234
ゾンビプロセスの検出と対処
# ゾンビプロセスの確認
$ ps aux | awk '$8=="Z" {print}'
# ゾンビプロセスの親プロセスを特定
$ ps -eo pid,ppid,stat,cmd | awk '$3~/Z/ {print}'
# 親プロセスにSIGCHLDを送って回収を促す
$ kill -SIGCHLD <親プロセスのPID>
ゾンビプロセスは直接killできません。親プロセスがwait()システムコールで子プロセスの終了状態を回収する必要があるため、対処は親プロセスに対して行います。
プロセスの監視スクリプト例
特定のサービスが停止した際に自動で再起動する簡易的な監視スクリプトの例です。シェルスクリプトとcronによる定期実行を組み合わせることで、簡易的なプロセス監視を実現できます。
#!/bin/bash
# process-monitor.sh - 指定サービスの死活監視と自動再起動
SERVICE="nginx"
LOG="/var/log/process-monitor.log"
if ! systemctl is-active --quiet "$SERVICE"; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - $SERVICE is down. Restarting..." >> "$LOG"
sudo systemctl restart "$SERVICE"
if systemctl is-active --quiet "$SERVICE"; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - $SERVICE restarted successfully." >> "$LOG"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to restart $SERVICE." >> "$LOG"
fi
fi
このスクリプトをcrontabに登録して1分ごとに実行すれば、サービスのダウンタイムを最小限に抑えられます。
まとめ:プロセス管理はLinuxサーバー運用の基礎力
本記事では、Linuxのプロセス管理に必要な基本概念とコマンドを解説しました。重要なポイントを振り返ります。
- ps:プロセスのスナップショットを取得し、一時点の状態を確認する
- top / htop:リアルタイムでプロセスとリソース使用状況を監視する
- kill / pkill:シグナルを送信してプロセスを制御する(まずSIGTERM、必要時のみSIGKILL)
- systemctl:systemd管理下のサービスを起動・停止・有効化する
- ジョブ制御:バックグラウンド実行とnohupで効率的に作業する
プロセス管理は、ユーザー・グループ管理やファイルパーミッションと並んで、Linuxサーバー運用の基盤となるスキルです。まずは開発環境や検証サーバーで各コマンドを実際に試し、出力の読み方に慣れることから始めてください。
プロセス管理をマスターしたら、次はログ管理やパフォーマンス監視を学ぶことで、サーバー運用のスキルをさらに高められます。トラブルシューティングの場面でも、プロセス管理の知識は欠かせません。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践