Linuxプロセス管理の理解ガイド:'ps'と'kill'の使い方
プロセス管理は、効果的なLinuxシステム管理の基本です。アプリケーションが応答しなくなったり、過剰なリソースを消費したり、正常に再起動する必要がある場合、それらを特定し、操作する方法を知ることが不可欠です。このガイドは、Linuxにおけるプロセス管理の基盤である、プロセス状態を表示するpsコマンドと、そのライフサイクルを管理するためにシグナルを送信するkillコマンドの包括的な入門書です。
Linuxが実行中のプログラム(それぞれに一意のプロセスID(PID)が割り当てられる)をどのように処理するかを理解することで、管理者はシステムの安定性を維持し、パフォーマンスのボトルネックをトラブルシューティングし、サービスが期待どおりに動作することを保証できます。ここでは、これらのコマンドをあらゆるシステム管理者のツールキットに不可欠なものにしている基本的な構文と一般的なフラグを探ります。
Linuxプロセスモデル:PIDと状態
Linuxでは、実行中のすべてのプログラム、サービス、タスクはプロセスとして扱われます。各プロセスは、カーネルによって作成時に割り当てられる正の整数であるプロセスID(PID)によって一意に識別されます。このPIDは、システムツールが特定のプロセスを参照および操作するための主要な方法です。
プロセスは、実行中(Running)、スリープ中(Sleeping)、停止中(Stopped)、ゾンビ(Zombie)など、さまざまな状態を遷移します。状態を知ることは、トラブルシューティングの手順をすぐに知らせてくれます。
psコマンドを使用したプロセスの表示
The ps(プロセス状態)コマンドは、現在実行中のプロセスに関する情報を表示するために使用されます。出力が膨大になる可能性があるため、どのプロセスを表示し、どの情報列を含めるかを選択するためにさまざまなオプションが使用されます。
必須のps構文とフラグ
psフラグには、Unixスタイル(-で始まる)とBSDスタイル(プレフィックスなし)の2つの主要な形式があります。最新の実践では、包括的なビューのためにUnixスタイルのフラグを組み合わせることが好まれます。
1. すべてのプロセスの表示(BSDスタイル)
システム概要の最も一般的なコマンドはps auxです。
a: すべてのユーザーのプロセスを表示します。u: ユーザー指向の形式(ユーザー、CPU使用率、メモリ使用量などを表示)でプロセスを表示します。x: 制御端末を持たないプロセス(バックグラウンドデーモンなど)を含めます。
ps aux
2. 標準形式でのプロセスの表示(UNIXスタイル)
ps -efコマンドは、古いものの依然として広く使用されている形式で完全なリストを提供します。
-e: すべてのプロセスを選択します。-f: 完全な形式のリストを表示します(PPIDとコマンド引数を含む)。
ps -ef
主要な出力列の解釈
使用するフラグに関係なく、プロセス管理にとって重要な列がいくつかあります。
| 列名 | 説明 |
|---|---|
| PID | プロセスID(一意の識別子) |
| PPID | 親プロセスID(これを開始したプロセスのPID) |
| USER | プロセスを所有するユーザー |
| %CPU | 使用されたCPU時間の割合 |
| %MEM | 使用された物理メモリの割合 |
| VSZ | 仮想メモリサイズ(KiB単位) |
| RSS | 常駐セットサイズ(使用された物理メモリ、KiB単位) |
| STAT | プロセスの現在の状態(例:R=実行中、S=スリープ中、Z=ゾンビ) |
| COMMAND | プロセスを開始したコマンド |
grepを使用したプロセスのフィルタリング
特定のプロセスを見つけるには、psの出力をgrepにパイプするのが標準的な方法です。
例:Apache Webサーバー(httpd)の実行中のすべてのインスタンスを見つける:
ps aux | grep httpd
ヒント:
ps | grepを使用すると、出力にgrepコマンド自体が表示されることがよくあります。これをフィルタリングするには、検索パターンで角括弧表記を使用します。
bash ps aux | grep '[h]ttpd'
killコマンドを使用したプロセスの管理
The killコマンドはプロセスを停止するだけでなく、シグナルを送信します。デフォルトの動作は正常な終了を要求することですが、他のシグナルは、プロセスに設定ファイルを再読み込みさせたり、実行を一時的に停止させたり、即時終了を強制したりすることができます。
シグナルの理解
シグナルは標準化された数値またはニーモニックコードです。kill -lを使用して利用可能なシグナルを一覧表示できます。
| シグナル名 | シグナル番号 | 説明 |
|---|---|---|
| SIGTERM | 15 | デフォルトの終了シグナル。プロセスに正常にシャットダウンするように要求します。 |
| SIGKILL | 9 | 即時かつ強制的な終了シグナル。プロセスはこのシグナルを無視できません。 |
| SIGHUP | 1 | ハングアップシグナル。デーモンが設定ファイルを再読み込みするためによく使用されます。 |
| SIGSTOP | 19 | プロセスを終了させずに停止(一時停止)します。 |
| SIGCONT | 18 | 停止したプロセスを再開します。 |
killを使用したシグナルの送信
The killコマンドの基本構文は次のとおりです。
kill -SIGNAL PID
1. 正常な終了(ベストプラクティス)
常に最初にSIGTERM(シグナル15)を使用してプロセスを正常に終了させます。これにより、アプリケーションはデータを保存し、接続を閉じるための時間が与えられます。
kill 12345 # SIGTERM (15)がデフォルト
# または
kill -15 12345
2. 強制終了(最終手段)
プロセスが応答せずSIGTERMを無視する場合は、SIGKILL(シグナル9)を使用します。これはプロセスをクリーンアップなしで即座に停止するため、特定のアプリケーションでデータ損失や破損につながる可能性があります。
kill -9 12345
名前によるプロセスの管理:pkillとkillall
psとkillはPIDに依存しますが、名前でプロセスをターゲットにする方が速い場合があります。これらのコマンドは細心の注意を払って使用してください。複数のプロセスに同時に影響を与える可能性があるためです。
killall
提供された正確なプロセス名に一致するすべてのプロセスを終了します。
killall httpd # 'httpd'という名前のすべてのプロセスにSIGTERMを送信
killall -9 cron # すべての'cron'プロセスを強制終了
pkill
killallよりも柔軟性が高く、シグナルを送信するプロセスを選択する際にパターンマッチング(正規表現)を許可します。
# コマンド名に'firefox'が含まれるすべてのプロセスをキルします
pkill -f firefox
killallとpkillに関する警告: 誤って重要なシステムプロセス(initやsystemdなど)をターゲットにすると、オペレーティングシステム全体が不安定になったりクラッシュしたりする可能性があります。killallまたは広範なパターンでpkillを使用する前に、必ずpsを使用してターゲットのPIDを確認してください。
プロセス管理ワークフローの概要
暴走しているアプリケーションのトラブルシューティングを行う際は、この体系的なアプローチに従ってください。
- 特定:
ps aux | grep <process_name>を使用してプロセスのPIDを見つけ、その状態を確認します。 - 状態の確認:
STAT列を確認します。Z(ゾンビ)の場合、親プロセスが無効になっているため、親プロセスをキルできない場合は再起動が必要になることがあります。 - 正常停止の試行:
SIGTERM(デフォルトのkill PID)を送信します。数秒待ちます。 - 停止の確認: 再度
psを実行します。 - 強制停止(必要な場合): プロセスが残っている場合は、
SIGKILL(kill -9 PID)を送信します。
psとkillを習得することは、健全で応答性の高いLinux環境を維持するために不可欠です。PIDと利用可能なさまざまなシグナルを理解することにより、管理者はシステム実行に対する正確な制御を得ることができます。