Linuxを使っていると、プログラムが応答しなくなったり、バックグラウンドで動いている処理を停止したくなったりすることがあります。
そんなときに使用する基本コマンドがkillコマンドです。
名前だけを見ると「プロセスを強制的に消すコマンド」に感じますが、実際には指定したPIDのプロセスへシグナルを送信するコマンドです。
通常は、まず正常終了を要求するSIGTERMを送り、それでも終了しない場合にだけSIGKILLを使用します。
この記事では、Linux初心者向けに、killコマンドの基本的な使い方、PIDの調べ方、シグナルの指定方法、kill -9を使う際の注意点、pkillやkillallとの違いまで分かりやすく解説します。
- killコマンドとは
- killコマンドの基本構文
- PIDを確認する方法
- 実行前に対象プロセスを確認する
- killコマンドはデフォルトでSIGTERMを送信する
- プロセスが終了したか確認する
- 強制終了する方法
- kill -9をすぐに使わない方がよい理由
- シグナルを名前で指定する方法
- 利用できるシグナルを確認する
- 設定を再読み込みさせる方法
- プロセスを一時停止する方法
- キーボードのCtrl+Cとの関係
- バックグラウンドジョブを終了する方法
- 複数のプロセスへ同時にシグナルを送る
- シグナルを送信できるか確認する
- 他ユーザーのプロセスを終了する
- systemctlで管理されているサービスを停止する
- kill・pkill・killallの違い
- killコマンドで親プロセスだけを終了した場合の注意点
- ゾンビプロセスはkillで終了できるのか
- killコマンドが効かない主な原因
- よく利用するコマンド一覧
- 安全にプロセスを終了する手順
- よくある質問
- まとめ
killコマンドとは
killは、指定したPIDのプロセスへシグナルを送信するLinuxコマンドです。
最も一般的な用途は、実行中のプロセスへ終了を要求することです。
kill 1234
この例では、PIDが1234のプロセスへSIGTERMが送信されます。
SIGTERMを受け取ったプロセスは、ファイルの保存や一時データの削除など、必要な終了処理を行ってから停止できます。
つまり、killコマンドは必ずしもプロセスを即座に強制終了するわけではありません。
killコマンドの基本構文
kill [オプションまたはシグナル] PID
PIDとは、Linux上で実行されている各プロセスに割り当てられる識別番号です。
例えば、PIDが2458のプロセスを終了する場合は次のように実行します。
kill 2458
複数のPIDをまとめて指定することもできます。
kill 2458 2460 2463
この場合、指定したすべてのプロセスへ同じシグナルが送信されます。
PIDを確認する方法
killコマンドを使用するには、終了したいプロセスのPIDを調べる必要があります。
psコマンドで確認する
ps -ef | grep nginx
実行例
root 1514 1 0 10:00 ? 00:00:00 nginx: master process
www-data 1515 1514 0 10:00 ? 00:00:00 nginx: worker process
この例では、1514と1515がPIDです。
pgrepコマンドで確認する
pgrep -a nginx
実行例
1514 nginx: master process /usr/sbin/nginx
1515 nginx: worker process
プロセス名が分かっている場合は、pgrepの方が短く分かりやすく確認できます。
実行前に対象プロセスを確認する
PIDは、プロセスが終了すると別のプロセスへ再利用されることがあります。
そのため、以前メモしたPIDをそのまま使うのではなく、killを実行する直前に対象を確認しましょう。
ps -p 2458 -o pid,user,etime,cmd
実行例
PID USER ELAPSED CMD
2458 user01 00:12:34 python app.py
PIDだけでなく、実行ユーザーやコマンド内容も確認すると、別のプロセスを誤って停止するリスクを減らせます。
killコマンドはデフォルトでSIGTERMを送信する
シグナルを省略してkillコマンドを実行すると、通常はSIGTERMが送信されます。
kill 2458
次の書き方も同じ意味です。
kill -TERM 2458
シグナル番号を使う場合は次のように指定します。
kill -15 2458
SIGTERMは、対象プロセスへ正常終了を要求するシグナルです。
プロセス側で終了処理を実行できるため、最初に試すべき方法です。
プロセスが終了したか確認する
killコマンドは、シグナルの送信を行うコマンドです。
コマンドがエラーなく終了しても、対象プロセスがすぐに停止したとは限りません。
実行後は、もう一度プロセスを確認しましょう。
ps -p 2458
何も表示されなければ、そのPIDのプロセスは終了しています。
プロセス名から確認する場合は次のように実行できます。
pgrep -a nginx
強制終了する方法
SIGTERMを送ってもプロセスが終了しない場合は、SIGKILLを使用する方法があります。
kill -KILL 2458
よく見かける次の書き方も同じ意味です。
kill -9 2458
SIGKILLは、対象プロセスを強制的に終了するシグナルです。
プロセス側で拒否したり、終了前の処理を行ったりすることはできません。
そのため、未保存のデータが失われる、一時ファイルが残る、処理中のデータが不整合を起こすといった危険があります。
最初からkill -9を使用せず、まず通常のkillでSIGTERMを送り、それでも終了しない場合の最終手段として使いましょう。
kill -9をすぐに使わない方がよい理由
kill -9は確実にプロセスを停止できるため、便利に見えます。
しかし、プロセスへ終了準備の時間を与えないため、次のような問題が起こる可能性があります。
- 編集中のデータが保存されない
- ロックファイルや一時ファイルが残る
- データベースの処理が途中で切断される
- ログへ正常な終了記録が残らない
- 子プロセスや関連処理が残る
特にデータベースやWebサーバーなどの重要なサービスでは、killコマンドよりもサービス専用の停止方法やsystemctl stopを優先してください。
シグナルを名前で指定する方法
killコマンドでは、送信するシグナルを名前で指定できます。
kill -TERM 2458
kill -HUP 2458
kill -STOP 2458
名前で指定すると、そのシグナルが何を意図しているのか分かりやすくなります。
手順書やシェルスクリプトでは、番号よりも名前で記述すると読みやすくなります。
利用できるシグナルを確認する
利用できるシグナルの一覧は、次のコマンドで確認できます。
kill -l
実行例
1) SIGHUP
2) SIGINT
9) SIGKILL
15) SIGTERM
18) SIGCONT
19) SIGSTOP
システムや環境によって番号の表示形式が異なる場合があります。
よく利用するシグナルは次のとおりです。
| シグナル | 番号 | 一般的な用途 |
|---|---|---|
SIGHUP |
1 | 設定の再読み込みなど |
SIGINT |
2 | 端末から処理を中断する |
SIGKILL |
9 | 強制終了する |
SIGTERM |
15 | 正常終了を要求する |
SIGCONT |
18 | 停止中の処理を再開する |
SIGSTOP |
19 | プロセスを一時停止する |
シグナル番号は一般的なLinux環境で使われる値ですが、移植性や読みやすさを考えると名前で指定する方が安全です。
設定を再読み込みさせる方法
一部の常駐プロセスでは、SIGHUPを送ることで設定ファイルを再読み込みできます。
kill -HUP 1514
ただし、SIGHUPを受け取った際の動作はプログラムごとに異なります。
設定を再読み込みするものもあれば、終了するもの、何も行わないものもあります。
実行前に対象ソフトウェアの公式ドキュメントやマニュアルを確認してください。
プロセスを一時停止する方法
プロセスを終了せず、一時的に停止させたい場合はSIGSTOPを送信します。
kill -STOP 2458
SIGSTOPを受けたプロセスは、終了せずに実行を停止します。
停止したプロセスを再開するにはSIGCONTを送ります。
kill -CONT 2458
長時間動作する処理を一時的に止めたい場合や、CPU負荷を一時的に抑えたい場合に利用できます。
キーボードのCtrl+Cとの関係
ターミナルで実行中のコマンドに対してCtrl+Cを押すと、通常はSIGINTが送信されます。
killコマンドから同じシグナルを送る場合は次のように実行します。
kill -INT 2458
SIGINTは、プログラムへ対話的な中断を要求するシグナルです。
プログラムによっては、SIGINTを受け取った際に終了前の処理を行う場合があります。
バックグラウンドジョブを終了する方法
現在のシェルからバックグラウンド実行したジョブは、jobsコマンドで確認できます。
jobs -l
実行例
[1]+ 2458 Running sleep 1000 &
表示されたPIDを指定して終了できます。
kill 2458
同じシェル内のジョブであれば、ジョブ番号を指定することもできます。
kill %1
%1はジョブ番号1を意味します。
ただし、ジョブ番号は現在のシェルでのみ有効です。別のターミナルやシェルから操作する場合はPIDを指定してください。
複数のプロセスへ同時にシグナルを送る
killコマンドでは、複数のPIDをまとめて指定できます。
kill 2458 2460 2463
すべてのPIDへ同じシグナルが送信されます。
SIGTERMを明示する場合は次のとおりです。
kill -TERM 2458 2460 2463
複数指定するときは、対象PIDを取り違えないよう、事前にpsで確認しておきましょう。
シグナルを送信できるか確認する
kill -0を使うと、実際には終了シグナルを送らず、対象プロセスが存在するか、シグナルを送信する権限があるかを確認できます。
kill -0 2458
何も表示されず終了ステータスが0なら、通常は対象プロセスが存在し、現在のユーザーに操作権限があります。
対象が存在しない、または権限がない場合はエラーになります。
kill: (2458) - No such process
シェルスクリプトでは次のように利用できます。
if kill -0 2458 2>/dev/null; then
echo "プロセスは存在します"
else
echo "プロセスが存在しないか、権限がありません"
fi
kill -0だけでは「存在しない」のか「権限がない」のかを完全には区別できない点には注意してください。
他ユーザーのプロセスを終了する
一般ユーザーは、通常、自分が実行したプロセスにだけシグナルを送信できます。
他ユーザーやrootが実行しているプロセスを操作するには、管理者権限が必要です。
sudo kill 2458
ただし、sudoを使えば安全になるわけではありません。
root権限では重要なシステムプロセスも停止できてしまうため、PID、ユーザー名、実行コマンドを必ず確認してください。
ps -p 2458 -o pid,user,ppid,etime,cmd
systemctlで管理されているサービスを停止する
Nginx、Apache、MySQL、SSHなど、systemdで管理されているサービスは、killコマンドよりもsystemctlで停止するのが基本です。
sudo systemctl stop nginx
再起動する場合は次のように実行します。
sudo systemctl restart nginx
systemctlを使うと、サービスの状態管理や依存関係、ログ、再起動設定を考慮した操作ができます。
一方、killでサービスのプロセスだけを終了すると、監視設定によってすぐ再起動されたり、親プロセスだけが残ったりする場合があります。
サービスの状態は次のコマンドで確認できます。
systemctl status nginx
kill・pkill・killallの違い
| コマンド | 指定方法 | 向いている場面 |
|---|---|---|
kill |
PIDを指定 | 対象のプロセスを確実に1件ずつ操作したい |
pkill |
プロセス名やユーザーなどの条件を指定 | 条件に一致するプロセスへまとめてシグナルを送りたい |
killall |
主にプロセス名を指定 | 同名のプロセスをまとめて終了したい |
誤操作を防ぎやすいのは、PIDを確認してから実行するkillコマンドです。
対象が複数あり、条件でまとめて操作したい場合はpkillが便利です。
killコマンドで親プロセスだけを終了した場合の注意点
親プロセスを終了しても、子プロセスが必ず一緒に終了するとは限りません。
子プロセスが残ると、別の親プロセスへ引き継がれたり、そのまま処理を続けたりする場合があります。
親子関係は次のように確認できます。
ps -ef --forest
または、親PIDを指定して子プロセスを検索できます。
pgrep -a -P 2458
複数の関連プロセスを停止する必要がある場合は、サービス専用の停止手順やsystemctlを優先してください。
ゾンビプロセスはkillで終了できるのか
ゾンビプロセスは、すでに処理を終了しているものの、親プロセスが終了ステータスを回収していない状態です。
psコマンドでは、STAT列にZが表示されます。
ps -eo pid,ppid,stat,cmd
ゾンビプロセス自体はすでに実行を終えているため、通常のkillやkill -9を送っても消えません。
親プロセスが子プロセスの終了状態を回収する必要があります。
親プロセスの再起動や終了が必要になる場合がありますが、重要なサービスであれば影響範囲を確認してから操作してください。
killコマンドが効かない主な原因
PIDがすでに変わっている
対象プロセスが一度終了し、別のPIDで再起動されている可能性があります。
もう一度pgrepやpsで最新のPIDを確認してください。
pgrep -a nginx
権限が不足している
他ユーザーのプロセスには、一般ユーザーからシグナルを送信できません。
必要な場合はsudoを利用します。
sudo kill 2458
プロセスがSIGTERMを無視している
プログラム側がSIGTERMを無視している、または終了処理に時間がかかっている場合があります。
ログやプロセス状態を確認し、それでも終了しないときにだけSIGKILLを検討します。
プロセスがD状態になっている
STAT列がDのプロセスは、主に割り込み不能なI/O待ち状態です。
この状態では、SIGKILLを送ってもすぐに終了しない場合があります。
ディスクやNFS、ストレージ、カーネル側のI/O処理が戻るまで待つ必要があるため、原因となっているI/O障害を調査してください。
よく利用するコマンド一覧
| コマンド | 用途 |
|---|---|
kill PID |
SIGTERMで正常終了を要求する |
kill -TERM PID |
SIGTERMを明示して送信する |
kill -KILL PID |
SIGKILLで強制終了する |
kill -HUP PID |
SIGHUPを送信する |
kill -STOP PID |
プロセスを一時停止する |
kill -CONT PID |
停止中のプロセスを再開する |
kill -0 PID |
存在と操作権限を確認する |
kill -l |
シグナル一覧を表示する |
安全にプロセスを終了する手順
killコマンドを安全に使う場合は、次の流れがおすすめです。
- psまたはpgrepでPIDと実行内容を確認する
- systemd管理サービスではないか確認する
- 通常のkillでSIGTERMを送信する
- psまたはpgrepで終了を確認する
- 終了しない原因を調査する
- どうしても必要な場合だけSIGKILLを使用する
実際のコマンドでは、次のような流れになります。
pgrep -a sample-app
kill 2458
ps -p 2458
kill -KILL 2458
最後のSIGKILLは、通常のkillで終了しない場合だけ実行してください。
よくある質問
killコマンドを実行すると必ず強制終了になりますか?
いいえ。
シグナルを省略した通常のkillではSIGTERMが送信され、プロセスへ正常終了を要求します。
killとkill -9の違いは何ですか?
kill PIDは通常SIGTERMを送り、プロセスが終了処理を行えるようにします。
kill -9 PIDはSIGKILLを送り、終了処理を行わせずに強制終了します。
PIDはどうやって調べますか?
psやpgrepを利用します。
pgrep -a プロセス名
killを実行しても何も表示されません
killコマンドは、正常にシグナルを送信できた場合、通常は何も表示しません。
対象が終了したかどうかは、psやpgrepで再確認してください。
kill -9でも終了しないことはありますか?
あります。
プロセスが割り込み不能なI/O待ち状態になっている場合、SIGKILLを送ってもI/O処理が戻るまで終了しないことがあります。
サービスを停止するときもkillを使いますか?
systemdで管理されているサービスは、通常systemctl stopを使用します。
killは、PIDを直接指定してプロセスへシグナルを送りたい場面で利用してください。
ゾンビプロセスはkill -9で消せますか?
通常は消せません。
ゾンビプロセスはすでに実行を終了しているため、親プロセスが終了ステータスを回収する必要があります。
まとめ
killコマンドは、LinuxでPIDを指定し、プロセスへシグナルを送信するための基本コマンドです。
特に重要なのは、killが単なる強制終了コマンドではないという点です。
通常のkill PIDではSIGTERMが送られ、プロセスへ正常終了を要求します。
一方、kill -9 PIDは終了処理を行わせずに強制停止するため、最終手段として使用してください。
| コマンド | 用途 |
|---|---|
kill PID |
正常終了を要求する |
kill -9 PID |
強制終了する |
kill -HUP PID |
設定の再読み込みなどを要求する |
kill -STOP PID |
プロセスを一時停止する |
kill -CONT PID |
プロセスを再開する |
kill -0 PID |
存在と権限を確認する |
実運用では、「PIDを確認する → SIGTERMを送る → 終了を確認する → 必要な場合だけSIGKILLを使う」という順番を守ることで、誤操作やデータ破損のリスクを抑えられます。




コメント