宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「プロセスが応答しなくなった。kill -9 すれば終わるけど、本当にそれでいいのか?」
サーバー運用の現場で、最も日常的に使うのに、最も誤解されやすいのが kill / killall / pkill の3コマンドです。

この記事では、プロセスの終了に使う kill コマンドのシグナルの仕組み、TERM と KILL の使い分け、killall・pkill との違いまで、現場で迷わず判断できる基準で解説します。
RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・プロセスの終了は kill コマンドでシグナルを送って行う
・通常は TERM(15番)、効かない時だけ KILL(9番)を使う
・プロセス名で終了するなら killall / pkill が便利
・kill -9 はファイル破損リスクがあり最終手段にする


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

プロセスを終了する基本:kill コマンドとシグナルの仕組み

プロセスを終了するには、kill コマンドを実行します。
kill コマンドは、プロセスに対してシグナルというメッセージを送信します。
プロセスはシグナルを受け取ると、終了や再起動など、受け取ったシグナルに応じて処理を実行します。

シグナルには、シグナル名とシグナルID(番号)がつけられており、kill コマンドで指定して実行します。

kill コマンドで利用できるシグナルは、「kill -l」で参照できます。

$ kill -l  ←シグナル一覧を表示します。 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX

主に利用するシグナルを下記にまとめます。
シグナル名 シグナルID 動作
HUP 1 ハングアップ(設定再読み込みに利用)
INT 2 割り込み(Ctrl+cキー)
KILL 9 強制終了(プロセスは捕捉できない)
TERM 15 終了(デフォルト、正常終了)
CONT 18 停止しているプロセスを再開
STOP 19 一時停止
HUPシグナルは、デーモンプログラムの設定を変更した際に、設定ファイルを再読み込みする際に利用します。
INTシグナルは、割り込みによって動作を停止させます。
KILLシグナルは、プロセスを直ちに強制終了させます。
TERMシグナルは、プロセスを正常終了させます。
正常終了とは、開いているファイルがあるなら閉じるなどの適切な手順を実行して終了することを指します。

kill コマンドでプロセスにシグナルを送る基本構文

シグナルを指定しないで、kill コマンドを実行した場合は、TERMシグナルがプロセスに送信されます。
PIDが1523のプロセスにTERMシグナルを送る場合、下記のように実行します。

$ kill 1523

また、下記のように記述しても同じになります。

$ kill -15 1523 $ kill -s 15 1523 $ kill -TERM 1523 $ kill -SIGTERM 1523

プログラムが異常動作を起こした場合などは、TERMシグナルで終了できない場合があります。
そのような時には、KILLシグナルを送信して強制終了します。

$ kill -KILL 1523

KILLシグナルで強制終了した場合、プロセスが開いていたファイルがそのまま開いたままになる事があります。
そのため、ファイルが壊れたりしてシステムに何らかの障害が発生する可能があるので、KILLシグナルを実行するのは、最終手段にすべきです。

一般的に、親プロセスを強制終了すると、その親プロセスから生成された子プロセスも終了します。

また、プロセスは複数並べて指定することも出来ます。

$ kill -KILL 1522 1523

【重要】kill -9(強制終了)は最終手段にすべき理由

現場でトラブルが起きると「とりあえず kill -9」とやりがちですが、これは正しい判断ではありません。

KILL(9番)シグナルは、プロセス側で捕捉も無視もできない強制終了シグナルです。
そのため、プロセス側で以下のような正常終了処理が一切走りません。

開いているファイルのクローズ:書きかけのデータがフラッシュされず、ファイルが破損する可能性があります。
子プロセスの片付け:子プロセスが孤児(init/systemdに引き取られる)として残ることがあります。
ロックファイルの削除:/var/run/ 配下の .pid や .lock ファイルが残り、次回起動時に「すでに動いている」と誤認されて起動失敗することがあります。
共有メモリ・セマフォの解放:IPCリソースが残り、メモリリーク状態になります。

特にMySQL・PostgreSQL・MongoDBなどのDBサーバーに対する kill -9 は、データファイル破損のリスクがあり絶対に避けるべきです。
DBサーバーは必ず systemctl stop または専用の停止コマンド(mysqladmin shutdown など)で終わらせます。

順序としては、TERM(15番)→ 数秒待つ → 終わらなければ KILL(9番)が正解です。

kill コマンドでデーモンの設定を再読み込みする:HUP シグナルの実務

kill コマンドは終了以外にも使います。
HUP(1番)シグナルは、デーモンプロセスに設定ファイルを再読み込みさせる用途で使うのが一般的です。

たとえば、Nginxの設定を変更した後、サービス停止なしで反映させる場合は以下のように実行します。

# PIDを確認 # cat /var/run/nginx.pid 2345 # HUPシグナルを送信して設定リロード # kill -HUP 2345

Apache(httpd)やrsyslogd、sshdなど、多くのデーモンが HUP シグナルで設定再読み込みに対応しています。
ただし、現代のRHEL系・Ubuntu系ではsystemctl reload を使うのが推奨です。

# systemctl 経由で設定リロード(推奨) # systemctl reload nginx # systemctl reload httpd

systemctl reload は内部的に HUP シグナルを送る、もしくはユニットファイルで定義されたReloadExecStartコマンドを実行します。
PIDを調べる手間が省けて、ログも journalctl に残るため、運用面ではこちらが扱いやすいです。

killall コマンド:プロセス名でまとめて終了する

kill コマンドでは、PIDを指定する必要がありますが、killall コマンドを使うと、プロセス名で指定することができます。
下記例では、vimプロセスにすべてに対して、TERMシグナルが送られます。

$ killall vim

下記のように記述して使用することもできます。

# killall httpd # killall mysqld

killall も -9 や -HUP などシグナルの指定が可能です。

# プロセス名 vim にKILLシグナル # killall -9 vim # プロセス名 nginx にHUPシグナルで設定リロード # killall -HUP nginx

killall は「完全一致」でプロセス名をマッチします。
たとえば nginx と書いた場合、nginx-worker のようなプロセスにはマッチしないので注意してください。

pkill コマンド:パターンマッチで柔軟にプロセスを終了する

pkill は killall の上位互換に近いコマンドで、部分一致や正規表現でプロセスを指定できます。
プロセス名の一部しか覚えていない時や、特定ユーザーのプロセスだけ終了したい時に便利です。

# プロセス名に "chrome" を含むものをすべて終了 $ pkill chrome # 特定ユーザーのプロセスのみ終了(-uオプション) # pkill -u apache httpd # シグナルを明示(-KILL / -9) # pkill -9 stress # 完全一致にしたい場合は -x オプション $ pkill -x bash

pgrepコマンドを併用すると、終了する前にどのプロセスが対象になるか確認できます。

# 先に pgrep で対象を確認 $ pgrep -l chrome 3421 chrome 3422 chrome 3450 chrome # 問題なければ pkill で終了 $ pkill chrome

pkill / pgrep は同じマッチング規則を共有しているため、pgrep で見えたものがそのまま pkill の対象になります。

kill / killall / pkill の使い分け:現場での判断軸

3つのコマンドの違いを、現場での使い分け基準でまとめます。
状況 使うコマンド 理由
PIDが分かっている特定の1プロセス kill PID 誤爆リスクが最も低い
プロセス名で複数まとめて終了 killall プロセス名 完全一致でシンプル
プロセス名の一部しか分からない pkill -f パターン 部分一致・正規表現が使える
特定ユーザーのプロセスのみ終了 pkill -u ユーザー名 ユーザー単位の絞り込みが効く
設定ファイルの再読み込み systemctl reload サービス名 journaldにログが残り運用しやすい
迷ったら、まず ps aux | grep プロセス名 や pgrep で対象PIDを確認し、kill PID で1つずつ終わらせるのが最も安全です。

「No such process」「Operation not permitted」が出た時の対処

kill コマンドでよく出るエラーは2つあります。

1つめは「kill: (PID) - No such process」。
これは指定したPIDのプロセスがすでに存在しないことを意味します。
すでに正常終了している、あるいはPIDの確認時から実行までの間に終わっている可能性があります。
ps -p PID で実在を確認してから再実行してください。

# PIDが実在するか確認 $ ps -p 1523 PID TTY TIME CMD 1523 pts/0 00:00:00 vim

2つめは「kill: (PID) - Operation not permitted」。
他ユーザーのプロセスを一般ユーザー権限で終了しようとした場合に出ます。
sudo を付けてroot権限で実行すれば終了できます。

# 他ユーザーのプロセスはsudo必須 $ sudo kill 1523

なお、PID 1(systemd または init)には KILL シグナルを送っても効きません。
カーネルが PID 1 の終了を許可しないためで、これはセキュリティ機構として正常な挙動です。

本記事のまとめ

kill コマンドはシグナルを送るためのコマンドで、終了だけでなく設定再読み込みにも使います。
通常はTERM(15番)を、効かない時だけKILL(9番)を、設定リロードはHUP(1番)または systemctl reload を使ってください。
やりたいこと コマンド
PIDを指定してプロセスを正常終了 kill PID
PIDを指定して強制終了(最終手段) kill -9 PID
デーモンの設定を再読み込み kill -HUP PID または systemctl reload サービス名
プロセス名でまとめて終了(完全一致) killall プロセス名
プロセス名でまとめて終了(部分一致・正規表現) pkill -f パターン
特定ユーザーのプロセスのみ終了 pkill -u ユーザー名 プロセス名
終了する前に対象プロセスを確認 pgrep -l プロセス名

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。