'ps'と'kill'を使ったLinuxプロセス管理の理解ガイド
`ps`でLinuxプロセスを調査し、主要なカラムを読み取り、`kill`、`pkill`、`killall`を使って安全にプロセスを停止する方法を学びます。
Linuxプロセス管理ガイド:'ps'と'kill'を理解する
Linuxプロセスの管理は、日常的なトラブルシューティングスキルです。アプリがハングしたとき、バックアップジョブがCPUを消費しているとき、デーモンをクリーンに再起動する必要があるとき、psはプロセスを見つけるのに役立ち、killは適切なシグナルを送信できます。
実行中のすべてのプログラムには、プロセスID(PID)があります。PIDがわかれば、所有権、親プロセス、CPUとメモリの使用状況を調査し、プロセスにクリーンな停止を依頼するか、最後の手段として強制終了するかを決定できます。
Linuxのプロセスモデル:PIDと状態
Linuxでは、実行中のすべてのプログラム、サービス、タスクはプロセスとして扱われます。各プロセスは、カーネルが作成時に割り当てる正の整数である**プロセスID(PID)**によって一意に識別されます。このPIDは、システムツールが特定のプロセスを参照および操作するための主要な方法です。
プロセスは、実行中、スリープ中、停止中、ゾンビなどの状態を遷移します。スリープ中のプロセスは通常、I/Oまたは別のイベントを待機しています。ゾンビはすでに終了していますが、親プロセスがその終了ステータスを収集していません。
psコマンドでプロセスを表示する
ps(プロセスステータス)コマンドは、現在実行中のプロセスに関する情報を表示するために使用されます。出力が膨大になる可能性があるため、表示するプロセスと含める情報列を選択するためにさまざまなオプションが使用されます。
基本的なps構文とフラグ
psフラグには主に2つのスタイルがあります。Unixスタイル(-で始まる)とBSDスタイル(接頭辞なし)です。最近の慣行では、包括的なビューを得るためにUnixスタイルのフラグを組み合わせることがよくあります。
1. すべてのプロセスを表示する(BSDスタイル)
システム全体を把握するための最も一般的なコマンドはps auxです。
a:すべてのユーザーのプロセスを表示します。u:ユーザー指向の形式でプロセスを表示します(ユーザー、CPU使用率、メモリ使用率などを表示)。x:制御端末を持たないプロセス(バックグラウンドデーモンなど)を含めます。
ps aux
2. 標準形式でプロセスを表示する(UNIXスタイル)
ps -efコマンドは、POSIXスタイルの形式で完全なリストを提供します。
-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のhttpdプロセスを検索する場合は次のようにします。
ps aux | grep httpd
ヒント:
ps | grepは、grepプロセス自体を表示することがよくあります。括弧表記を使用すると、その余分な一致を回避できます。ps aux | grep '[h]ttpd'
killコマンドでプロセスを管理する
killコマンドはプロセスを停止するだけでなく、プロセスにシグナルを送信します。デフォルトの動作は正常な終了を要求することですが、他のシグナルはプロセスに設定ファイルの再読み取り、実行の一時停止、または強制的な即時終了を指示できます。
シグナルを理解する
シグナルは、標準化された数値またはニーモニックコードです。利用可能なシグナルはkill -lを使用して一覧表示できます。
| シグナル名 | シグナル番号 | 説明 |
|---|---|---|
| SIGTERM | 15 | デフォルトの終了シグナル。プロセスに正常にシャットダウンするように要求します。 |
| SIGKILL | 9 | 即時、強制的な終了シグナル。プロセスはこれを無視できません。 |
| SIGHUP | 1 | ハングアップシグナル。デーモンが設定ファイルを再読み取りするためによく使用されます。 |
| SIGSTOP | 通常x86 Linuxでは19 | プロセスを終了せずに停止(一時停止)します。 |
| SIGCONT | 通常x86 Linuxでは18 | 停止したプロセスを再開します。 |
killでシグナルを送信する
killコマンドの基本的な構文は次のとおりです。
kill -SIGNAL PID
1. 正常な終了(ベストプラクティス)
最初にSIGTERMを試してください。これにより、アプリケーションは状態を保存し、ファイルを閉じ、リクエストを完了し、ロックを解放する機会を得られます。
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 <プロセス名>を使用して、プロセスのPIDを見つけ、その状態を確認します。 - 状態の確認:
STAT列を調べます。Zの場合、プロセスはすでに死んでいます。親プロセスがそれを回収する必要があります。何かを強制終了する前に、PPIDを確認してください。 - 正常な停止を試行:
SIGTERM(デフォルトのkill PID)を送信します。数秒待ちます。 - 停止の確認: 再度
psを実行します。 - 必要に応じて強制停止: プロセスが存続し、リスクを理解している場合は、
kill -9 PIDでSIGKILLを送信します。
実用的な習慣はシンプルです。PIDを特定し、所有者と状態を確認し、最も穏やかな有効なシグナルを送信し、結果を確認します。これにより、プロセスのクリーンアップが予測可能になり、間違ったワークロードを停止する可能性が減ります。