kill -9 でもプロセスが終了しないときの原因と解決方法

  • URLをコピーしました!

Linux では「プロセスが終了しない」ときによく試されるコマンドが kill -9(SIGKILL)です。
SIGKILL は最も強制的なシグナルで、通常は必ずプロセスを終了できます。

しかし、まれに kill -9 を実行してもプロセスが消えない という現象が発生します。
本記事では、その原因と解決方法について解説します。

目次

✅ なぜ kill -9 でも終了できないのか?

1. プロセスが D 状態(Uninterruptible Sleep) にある

  • ps auxtop コマンドで状態を確認すると、STAT 列に D と表示されることがあります。
  • これは ディスク I/O やネットワーク I/O を待っている状態 で、カーネル内で処理が完了するまで割り込みやシグナルを受け付けません。
  • そのため、kill -9 を送っても反応せず、ゾンビのように残ってしまいます。

例:

ps aux | grep myprocess
user   1234  0.0  0.1 123456  456 ?  D  10:00   0:01 myprocess

2. カーネルレベルの問題

  • デバイスドライバやファイルシステムに問題がある場合、プロセスがカーネル内で停止状態になることがあります。
  • 例えば、NAS や iSCSI などのネットワークストレージが切断された場合、I/O が返ってこずプロセスが終了できなくなります。

3. ゾンビプロセス(Z 状態)

  • ゾンビは終了済みだが親プロセスが wait() を呼んでいないため残っている状態です。
  • ゾンビ自体を kill することはできません(すでに死んでいるため)。
  • 対処は 親プロセスを終了させる か、親が init に引き継がれるのを待つ必要があります。

✅ 解決方法

1. プロセス状態を確認する

ps -o pid,stat,comm -p <PID>
  • D → I/O待ち
  • Z → ゾンビ
  • R / S → 実行可能

状態を見極めることが第一歩です。

2. D 状態の対処

  • 多くの場合、原因デバイスを復旧させるしかありません
    • NFS ならサーバを再起動/復旧
    • ディスク障害ならストレージ確認
  • 復旧すれば、I/O が返ってきてプロセスも終了可能になります。

💡 注意: D 状態に陥ったプロセスは基本的に「OS再起動」以外で解決できないことが多いです。

3. Z 状態の対処

  • 親プロセスを特定する
ps -o ppid= -p <PID>
  • 親が不要なら kill することでゾンビも消えます。

4. 最終手段

  • システムの安定性が損なわれている場合は OS再起動 が必要です。
  • サーバ運用中なら、再起動タイミングを調整することが重要です。

✅ まとめ

  • kill -9 でも終了しないのは プロセスがカーネル内で停止(D 状態)している場合がほとんど
  • ゾンビ(Z 状態) の場合は親プロセスの制御が必要。
  • 根本的な解決には 原因デバイスの復旧、または 再起動 が必要になることも多いです。
目次