killコマンドとプロセス管理:ps, lsofを使った安全なプロセス終了の手順

監視・アラート

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-fpm

2. kill コマンドの基本とシグナルの違い

PIDが分かったら、いよいよ kill コマンドでプロセスを終了させます。

kill [オプション(シグナル)] [PID]

ここで最も重要なのが「シグナル」の概念です。kill コマンドはプロセスを「殺す」のではなく、プロセスに対して「シグナル(信号)」を送るコマンドです。

実務で使う主なシグナルは以下の3つです。

シグナル名番号意味動作
SIGTERM15終了要求プロセスに「終わってね」と伝える。プロセスは後処理(ファイルの保存など)をしてから終了する。
SIGKILL9強制終了OSがプロセスを強制的にメモリから消去する。プロセスは後処理ができない。
SIGHUP1端末切断 / 再読み込みデーモンプロセス(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 1234

SIGKILLの危険性:SIGKILLはプロセスに後処理の隙を与えずにOSレベルでプロセスを消滅させます。そのため、データベースのプロセスなどにSIGKILLを送ると、データが破損する(データファイルが不整合な状態になる)リスクがあります。

4. プロセス名で一括終了する(pkill, killall)

複数のプロセス(例えば、多数のワーカープロセスを持つWebサーバーなど)をまとめて終了させたい場合は、PIDを一つずつ指定するのではなく、プロセス名で指定できるコマンドが便利です。

pkill コマンド

pgrepkill 版です。プロセス名にマッチするすべてのプロセスにシグナルを送ります。

# "php-fpm" という名前のプロセスすべてに SIGTERM を送る
pkill php-fpm

# 強制終了する場合は -9 を付ける
pkill -9 php-fpm

killall コマンド

pkill と似ていますが、プロセス名が完全に一致するものだけを対象にするなど、挙動に若干の違いがあります。

# "nginx" プロセスをすべて終了させる
killall nginx

まとめ

プロセスの終了は、システム運用において避けて通れない作業ですが、やり方を間違えるとデータ破損などの深刻な障害を引き起こす可能性があります。

  1. pslsof で対象のPIDを正確に特定する。
  2. まずはオプションなしの kill(SIGTERM)で安全な終了を試みる。
  3. 最終手段としてのみ kill -9(SIGKILL)を使用する。

この「安全なプロセス終了の3ステップ」を実務の基本として身につけてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする