「kill -9 で強制終了していいのか、毎回不安になる」
サーバー運用の現場では、応答しなくなったプロセスを安全に停止させる必要がある場面に必ず遭遇します。
この記事では、プロセスにシグナルを送る
kill(キル)コマンド の実践的な使い方を解説します。SIGTERM と SIGKILL の違いから、プロセス名で終了できる
killall / pkill、ゾンビプロセスへの対処法まで、現場で安全にプロセスを管理するためのノウハウをまとめました。killコマンドとは?(プロセスにシグナルを送るコマンド)
kill は、その名前から「プロセスを殺すコマンド」と思われがちですが、正確には プロセスに「シグナル」と呼ばれる通知を送るコマンド です。シグナルとは、Linuxカーネルがプロセスに対して「終了してください」「設定を再読み込みしてください」などの指示を伝える仕組みです。終了以外にもさまざまなシグナルがあり、用途に応じて使い分けます。
終了したいプロセスのPIDを調べる
kill コマンドを実行するには、対象プロセスの PID(プロセスID)が必要です。まずはPIDの調べ方を確認しましょう。1. ps aux | grep で探す
最も基本的な方法です。ps aux で全プロセスを一覧表示し、grep で絞り込みます。# httpd のプロセスを探す(grep 自身を除外する) $ ps aux | grep httpd | grep -v grep root 1234 0.0 0.5 230000 5000 ? Ss 10:00 0:00 /usr/sbin/httpd -DFOREGROUND apache 1235 0.0 0.3 230000 3000 ? S 10:00 0:00 /usr/sbin/httpd -DFOREGROUND
1234 です。※
grep -v grep を付けないと、grep自身のプロセスもヒットしてしまうため、パイプ3段(ps aux | grep xxx | grep -v grep)が定番の書き方です。2. pgrep でPIDだけを取得する
pgrep を使えば、プロセス名からPIDだけをシンプルに取得できます。# httpd のPIDだけを表示する $ pgrep httpd 1234 1235 # プロセス名も一緒に表示する $ pgrep -a httpd 1234 /usr/sbin/httpd -DFOREGROUND 1235 /usr/sbin/httpd -DFOREGROUND
基本的な使い方(シグナルの種類と違い)
PIDが分かったら、kill コマンドでシグナルを送ります。シグナルの使い分けが非常に重要なので、しっかり理解してください。1. まずは kill(SIGTERM)で「お願い」する
シグナルを指定せずにkill を実行すると、デフォルトで SIGTERM(シグナル番号15)が送られます。これは「正常に終了してください」というお願いです。# PID 1234 のプロセスに終了をお願いする(SIGTERM) $ kill 1234 # 明示的にシグナル番号を指定する書き方(上と同じ意味) $ kill -15 1234
2. kill -9(SIGKILL)で「強制終了」する
SIGTERM を送っても終了しないプロセスには、SIGKILL(シグナル番号9)を使います。これはカーネルが直接プロセスを停止させるため、プロセス側で無視することができません。# PID 1234 のプロセスを強制終了する $ kill -9 1234 # シグナル名で指定する書き方 $ kill -SIGKILL 1234
3. kill -1(SIGHUP)で「設定を再読み込み」させる
SIGHUP(シグナル番号1)は、多くのデーモン(サーバープロセス)で「設定ファイルの再読み込み」として解釈されます。プロセスを停止せずに設定変更を反映したい時に使います。# Apache に設定ファイルを再読み込みさせる # kill -1 1234 # または # kill -HUP 1234
なお、systemd環境では
systemctl reload httpd のようにサービス単位で再読み込みする方が確実です。kill でシグナルを送るのは、systemctl が使えない場面やデーモン以外のプロセスが対象の場合に使ってください。以下が、覚えておくべき主要シグナルの一覧です。
・SIGTERM(15):正常終了を要求する。プロセスが後始末をしてから終了する(デフォルト)
・SIGKILL(9):強制終了。プロセスは無視できない。後始末は行われない
・SIGHUP(1):設定ファイルの再読み込み(対応しているデーモンのみ)
・SIGINT(2):割り込みによる終了。キーボードの Ctrl + C と同じ動作
・SIGSTOP(19):プロセスを一時停止する。SIGCONT(18)で再開できる
プロセス名で終了する(killall / pkill)
PIDをいちいち調べるのが面倒な場合、プロセス名を直接指定して終了させるコマンドがあります。1. killall でプロセス名を指定する
killall は、指定した名前に完全一致するすべてのプロセスにシグナルを送ります。# httpd という名前のプロセスをすべて終了する $ killall httpd # 強制終了する場合 $ killall -9 httpd
2. pkill で柔軟に検索して終了する
pkill は部分一致で検索できるため、killall よりも柔軟にプロセスを指定できます。# プロセス名に "http" を含むプロセスをすべて終了する $ pkill http # 特定のユーザーが実行しているプロセスだけを終了する $ pkill -u apache httpd
【重要】killall / pkill の危険性
killall や pkill は 条件に一致するすべてのプロセスにシグナルを送る ため、意図しないプロセスまで終了させてしまうリスクがあります。特に本番サーバーでは、まず
pgrep で対象のプロセスを確認してから実行するのが鉄則です。# まず対象を確認する(終了はしない) $ pgrep -a httpd 1234 /usr/sbin/httpd -DFOREGROUND 1235 /usr/sbin/httpd -DFOREGROUND # 確認できたら終了する $ pkill httpd
実務で使えるkillのTips
ゾンビプロセスが残った時の対処法
ps aux の STAT 列に Z と表示されるプロセスは「ゾンビプロセス」です。これはすでに実行が終了しているが、親プロセスが終了状態を回収していないプロセスです。ゾンビプロセス自体にはCPUやメモリを消費しないため実害は少ないですが、大量に溜まるとプロセステーブルを圧迫します。
ゾンビプロセスに
kill を送っても効果はありません。対処法は 親プロセスにSIGCHLDを送る か、親プロセスを終了させる ことです。# ゾンビプロセスを確認する $ ps aux | grep -w Z user 5678 0.0 0.0 0 0 ? Z 10:00 0:00 [defunct] # 親プロセスのPIDを調べる(PPIDが親のPID) $ ps -o pid,ppid,stat,cmd -p 5678 PID PPID STAT CMD 5678 4321 Z [defunct] # 親プロセスにSIGCHLDを送る $ kill -SIGCHLD 4321
kill -0 でプロセスの生存確認をする
シグナル番号0 は特殊なシグナルで、実際にはシグナルを送らず、プロセスが存在するかどうかだけを確認できます。シェルスクリプトでプロセスの生存チェックに使えます。# PID 1234 のプロセスが存在するか確認する $ kill -0 1234 && echo "プロセスは実行中" || echo "プロセスは存在しない"
「kill しても終了しない」時の対処法
kill(SIGTERM)を送ってもプロセスが終了しない場合、いくつかの原因が考えられます。1. プロセスがSIGTERMをハンドリングしている
一部のプロセスは、SIGTERM を受け取った時に独自の処理を行い、すぐには終了しないことがあります。数秒~数十秒待ってもまだ終了しない場合は、kill -9(SIGKILL)を使ってください。# SIGTERM を送る $ kill 1234 # 5秒待ってもプロセスが残っている場合 $ sleep 5 && kill -0 1234 && kill -9 1234
2. D状態(ディスクI/O待ち)のプロセス
ps aux の STAT 列が D(割り込み不可のスリープ状態)になっているプロセスは、ディスクI/Oの完了を待っている状態です。D状態のプロセスは SIGKILL でも終了できません。これはカーネルレベルでI/O完了を待っているためで、kill では対処できません。
NFSマウントのハングやディスク障害が原因のことが多いため、マウントポイントの状態やストレージを確認してください。
3. 権限が足りない(Permission denied)
一般ユーザーで他のユーザーが起動したプロセスを kill しようとすると「Operation not permitted」エラーになります。root ユーザーかsudo を使って実行してください。# 一般ユーザーで実行するとエラーになる場合 $ kill 1234 -bash: kill: (1234) - Operation not permitted # sudo を付けて実行する $ sudo kill 1234
本記事のまとめ(kill関連コマンド早見表)
| やりたいこと | コマンド |
|---|---|
| プロセスを正常終了させる(SIGTERM) | kill PID |
| プロセスを強制終了させる(SIGKILL) | kill -9 PID |
| 設定ファイルを再読み込みさせる(SIGHUP) | kill -1 PID |
| プロセスの生存を確認する | kill -0 PID |
| プロセス名でPIDを調べる | pgrep -a プロセス名 |
| プロセス名を指定して終了する(完全一致) | killall プロセス名 |
| プロセス名を指定して終了する(部分一致) | pkill プロセス名 |
| 使用できるシグナル一覧を表示する | kill -l |
プロセス管理の基本をもっと体系的に学びたいですか?
killコマンドはプロセス管理の基本ですが、実務のサーバー運用では、プロセスの監視・トラブルシュート・安全な停止手順を体系的に身につけることが重要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
