サーバー運用の現場で、最も日常的に使うのに、最も誤解されやすいのが 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 はファイル破損リスクがあり最終手段にする
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
プロセスを終了する基本: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 | 一時停止 |
INTシグナルは、割り込みによって動作を停止させます。
KILLシグナルは、プロセスを直ちに強制終了させます。
TERMシグナルは、プロセスを正常終了させます。
正常終了とは、開いているファイルがあるなら閉じるなどの適切な手順を実行して終了することを指します。
kill コマンドでプロセスにシグナルを送る基本構文
シグナルを指定しないで、kill コマンドを実行した場合は、TERMシグナルがプロセスに送信されます。PIDが1523のプロセスにTERMシグナルを送る場合、下記のように実行します。
$ kill 1523
$ kill -15 1523 $ kill -s 15 1523 $ kill -TERM 1523 $ kill -SIGTERM 1523
そのような時には、KILLシグナルを送信して強制終了します。
$ kill -KILL 1523
そのため、ファイルが壊れたりしてシステムに何らかの障害が発生する可能があるので、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
ただし、現代のRHEL系・Ubuntu系ではsystemctl reload を使うのが推奨です。
# systemctl 経由で設定リロード(推奨) # systemctl reload nginx # systemctl reload httpd
PIDを調べる手間が省けて、ログも journalctl に残るため、運用面ではこちらが扱いやすいです。
killall コマンド:プロセス名でまとめて終了する
kill コマンドでは、PIDを指定する必要がありますが、killall コマンドを使うと、プロセス名で指定することができます。下記例では、vimプロセスにすべてに対して、TERMシグナルが送られます。
$ killall vim
# killall httpd # killall mysqld
# プロセス名 vim にKILLシグナル # killall -9 vim # プロセス名 nginx にHUPシグナルで設定リロード # killall -HUP nginx
たとえば 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 -l chrome 3421 chrome 3422 chrome 3450 chrome # 問題なければ pkill で終了 $ pkill chrome
kill / killall / pkill の使い分け:現場での判断軸
3つのコマンドの違いを、現場での使い分け基準でまとめます。| 状況 | 使うコマンド | 理由 |
|---|---|---|
| PIDが分かっている特定の1プロセス | kill PID |
誤爆リスクが最も低い |
| プロセス名で複数まとめて終了 | killall プロセス名 |
完全一致でシンプル |
| プロセス名の一部しか分からない | pkill -f パターン |
部分一致・正規表現が使える |
| 特定ユーザーのプロセスのみ終了 | pkill -u ユーザー名 |
ユーザー単位の絞り込みが効く |
| 設定ファイルの再読み込み | systemctl reload サービス名 |
journaldにログが残り運用しやすい |
「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
他ユーザーのプロセスを一般ユーザー権限で終了しようとした場合に出ます。
sudo を付けてroot権限で実行すれば終了できます。
# 他ユーザーのプロセスはsudo必須 $ sudo kill 1523
カーネルが 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 プロセス名 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:pkillコマンドとpgrepコマンドでプロセスを名前で操作する方法|kill・psの代替と実践例
- 前のページへ:lprコマンドで印刷ジョブを送信する方法|lpq・lprmやCUPS対応まで
- この記事の属するカテゴリ:プロセス管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます