Linuxサーバーを運用していると、「応答しなくなったプロセスを強制終了したい」「特定のポートを使っているプロセスを止めたい」といった状況に遭遇します。このとき、単に kill -9 を連発するのは非常に危険です。
本記事では、プロセスの特定から安全な終了、そして強制終了(SIGKILL)のリスクまで、実務で必須となるプロセス管理の手順を解説します。
1. プロセスを特定する(ps, lsof, pgrep)
kill コマンドでプロセスを終了させるには、まずそのプロセスのID(PID)を知る必要があります。プロセスを特定するための代表的な3つのコマンドを紹介します。
ps コマンドで名前から探す
もっとも一般的な方法は、ps コマンドと grep を組み合わせてプロセスを探す方法です。
# "nginx" という名前が含まれるプロセスを検索
ps aux | grep nginx出力結果の2列目がPID(プロセスID)です。
lsof コマンドでポート番号から探す
「ポート8080を使っているプロセスを止めたい」という場合は、lsof コマンドが便利です。
# TCPポート8080をリッスンしているプロセスを特定
sudo lsof -i :8080出力結果の PID 列を確認します。
pgrep コマンドでPIDだけを抽出する
プロセス名が完全に分かっている場合は、pgrep コマンドを使うとPIDだけをスッキリと取得できます。スクリプト内でPIDを変数に格納したい場合などに重宝します。
# "php-fpm" プロセスのPIDを一覧表示
pgrep php-fpm2. kill コマンドの基本とシグナルの違い
PIDが分かったら、いよいよ kill コマンドでプロセスを終了させます。
kill [オプション(シグナル)] [PID]ここで最も重要なのが「シグナル」の概念です。kill コマンドはプロセスを「殺す」のではなく、プロセスに対して「シグナル(信号)」を送るコマンドです。
実務で使う主なシグナルは以下の3つです。
| シグナル名 | 番号 | 意味 | 動作 |
|---|---|---|---|
| SIGTERM | 15 | 終了要求 | プロセスに「終わってね」と伝える。プロセスは後処理(ファイルの保存など)をしてから終了する。 |
| SIGKILL | 9 | 強制終了 | OSがプロセスを強制的にメモリから消去する。プロセスは後処理ができない。 |
| SIGHUP | 1 | 端末切断 / 再読み込み | デーモンプロセス(Nginxなど)に対して、設定ファイルの再読み込みを促す際によく使われる。 |
3. 安全なプロセス終了のステップ
プロセスを終了させる際は、いきなり強制終了(kill -9)するのではなく、以下のステップを踏むのが鉄則です。
ステップ1:SIGTERM(15)で安全に終了を試みる
オプションを指定せずに kill コマンドを実行すると、デフォルトで SIGTERM (15) が送信されます。
# PID 1234 に SIGTERM を送る(安全な終了)
kill 1234
# または
kill -15 1234プロセスはこのシグナルを受け取ると、書きかけのファイルを保存したり、ネットワーク接続を正しく閉じたりといった「後処理」を行ってから自発的に終了します。
ステップ2:終了したか確認する
シグナルを送った後、プロセスが本当に終了したか確認します。
ps -p 1234何も表示されなければ、無事に終了しています。
ステップ3:どうしても終了しない場合のみ SIGKILL(9)を使う
SIGTERMを送ってもプロセスが応答しない(ハングアップしている)場合や、どうしても即座に終了させたい場合にのみ、SIGKILL (9) を使用します。
# PID 1234 を強制終了する
kill -9 1234SIGKILLの危険性:SIGKILLはプロセスに後処理の隙を与えずにOSレベルでプロセスを消滅させます。そのため、データベースのプロセスなどにSIGKILLを送ると、データが破損する(データファイルが不整合な状態になる)リスクがあります。
4. プロセス名で一括終了する(pkill, killall)
複数のプロセス(例えば、多数のワーカープロセスを持つWebサーバーなど)をまとめて終了させたい場合は、PIDを一つずつ指定するのではなく、プロセス名で指定できるコマンドが便利です。
pkill コマンド
pgrep の kill 版です。プロセス名にマッチするすべてのプロセスにシグナルを送ります。
# "php-fpm" という名前のプロセスすべてに SIGTERM を送る
pkill php-fpm
# 強制終了する場合は -9 を付ける
pkill -9 php-fpmkillall コマンド
pkill と似ていますが、プロセス名が完全に一致するものだけを対象にするなど、挙動に若干の違いがあります。
# "nginx" プロセスをすべて終了させる
killall nginxまとめ
プロセスの終了は、システム運用において避けて通れない作業ですが、やり方を間違えるとデータ破損などの深刻な障害を引き起こす可能性があります。
psやlsofで対象のPIDを正確に特定する。- まずはオプションなしの
kill(SIGTERM)で安全な終了を試みる。 - 最終手段としてのみ
kill -9(SIGKILL)を使用する。
この「安全なプロセス終了の3ステップ」を実務の基本として身につけてください。
