killコマンドとは?LinuxでPIDを指定してプロセスを終了する方法

Linux

Linuxを使っていると、プログラムが応答しなくなったり、バックグラウンドで動いている処理を停止したくなったりすることがあります。

そんなときに使用する基本コマンドがkillコマンドです。

名前だけを見ると「プロセスを強制的に消すコマンド」に感じますが、実際には指定したPIDのプロセスへシグナルを送信するコマンドです。

通常は、まず正常終了を要求するSIGTERMを送り、それでも終了しない場合にだけSIGKILLを使用します。

この記事では、Linux初心者向けに、killコマンドの基本的な使い方、PIDの調べ方、シグナルの指定方法、kill -9を使う際の注意点、pkillやkillallとの違いまで分かりやすく解説します。

  1. killコマンドとは
  2. killコマンドの基本構文
  3. PIDを確認する方法
    1. psコマンドで確認する
    2. pgrepコマンドで確認する
  4. 実行前に対象プロセスを確認する
  5. killコマンドはデフォルトでSIGTERMを送信する
  6. プロセスが終了したか確認する
  7. 強制終了する方法
  8. kill -9をすぐに使わない方がよい理由
  9. シグナルを名前で指定する方法
  10. 利用できるシグナルを確認する
  11. 設定を再読み込みさせる方法
  12. プロセスを一時停止する方法
  13. キーボードのCtrl+Cとの関係
  14. バックグラウンドジョブを終了する方法
  15. 複数のプロセスへ同時にシグナルを送る
  16. シグナルを送信できるか確認する
  17. 他ユーザーのプロセスを終了する
  18. systemctlで管理されているサービスを停止する
  19. kill・pkill・killallの違い
  20. killコマンドで親プロセスだけを終了した場合の注意点
  21. ゾンビプロセスはkillで終了できるのか
  22. killコマンドが効かない主な原因
    1. PIDがすでに変わっている
    2. 権限が不足している
    3. プロセスがSIGTERMを無視している
    4. プロセスがD状態になっている
  23. よく利用するコマンド一覧
  24. 安全にプロセスを終了する手順
  25. よくある質問
    1. killコマンドを実行すると必ず強制終了になりますか?
    2. killとkill -9の違いは何ですか?
    3. PIDはどうやって調べますか?
    4. killを実行しても何も表示されません
    5. kill -9でも終了しないことはありますか?
    6. サービスを停止するときもkillを使いますか?
    7. ゾンビプロセスはkill -9で消せますか?
  26. まとめ

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を調べる必要があります。

PIDの確認には、pspgrepを利用します。

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

この例では、15141515が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コマンドを安全に使う場合は、次の流れがおすすめです。

  1. psまたはpgrepでPIDと実行内容を確認する
  2. systemd管理サービスではないか確認する
  3. 通常のkillでSIGTERMを送信する
  4. psまたはpgrepで終了を確認する
  5. 終了しない原因を調査する
  6. どうしても必要な場合だけ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はどうやって調べますか?

pspgrepを利用します。

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を使う」という順番を守ることで、誤操作やデータ破損のリスクを抑えられます。

コメント

タイトルとURLをコピーしました