web-dev-qa-db-ja.com

再起動しないと強制終了できないプロセスを強制終了するにはどうすればよいですか?

kill -9 $PIDで強制終了できない5つのプロセスがあり、cat /proc/$PID/cmdlineを実行すると現在のセッションがハングします。多分それらはゾンビプロセスです。

ps -ef or htopを実行すると、現在のセッションもハングします。しかし、topps -eは正常に機能しています。

したがって、ファイルシステムが応答しないという2つの問題があるようです。

これは仮想マシンを実行する本番マシンであるため、再起動することはできません。

次のプロセスIDが機能していません:16181 16765 5985 7427 7547

これらのプロセスの親はinitです

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

そしてqemuプロセスの1つが機能していません

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
11
Sam Stoelinga

あなたはゾンビを持っていません。 cat /proc/$PID/cmdlineはゾンビに問題はありません。もし kill -9はプログラムを強制終了しません 、それはプログラムが割り込み不可能なI/O操作を実行していることを意味します。これは通常、次の3つのうちの1つを示します。

  • 応答しないネットワークファイルシステム。
  • カーネルのバグ。
  • ハードウェアのバグ。

psなどのユーティリティは、上記のいずれかの理由でカーネルが提供していないプロセス実行可能パスなどの情報を読み取ろうとするとハングする場合があります。

お試しください cat /proc/16181/syscall 16181が実行しているプロセスを確認します。これは、システムの距離に応じて機能する場合と機能しない場合があります。

問題がネットワークファイルシステムである場合は、強制的にアンマウントするか、オンラインにすることができます。問題がカーネルまたはハードウェアのバグである場合、何ができるかはバグの性質によって異なります。再起動(および固定カーネルへのアップグレード、または壊れたハードウェアの交換)を強くお勧めします。

他の答えは、これらがゾンビプロセスであると想定しています。ゾンビプロセスは実行が終了したプロセスですが、親が終了ステータスを知りたい場合に備えて、まだプロセステーブルにあります。これらは正常であり、initはそれに割り当てられたゾンビプロセスを自動的にクリーンアップします。

ゾンビプロセスが原因でハングアップすることはないため、問題ではないようです。システムコールまたはドライバーがハングしている場合、プロセスは中断できない状態にある可能性があります。良い説明があります ここ

7
David Baggerman

Linuxでゾンビプロセスを見つけるには:

$ ps axo stat、ppid、pid、comm | grep -w defunct

Z 555 10242くそーゾンビ<廃止>

まず、killコマンドを使用して、ゾンビの親プロセスにSIGCHLDシグナルを送信してみることができます。上記のコマンドは、各ゾンビのPPID(親プロセスのPID)を提供することに注意してください。この例では、ゾンビのPPIDは_555_です。

$ Sudo kill -s SIGCHLD 555

それでもゾンビプロセスが消えない場合は、ゾンビの親プロセス(555など)を強制終了できます。

$ Sudo kill -9 555

親プロセスが終了すると、ゾンビはLinuxのすべてのプロセスの親であるinitプロセスによって採用されます。 initプロセスは定期的にwait()を呼び出して、ゾンビプロセスを取得します。

2

ゾンビを殺すには、その親を殺す必要があります。ゾンビプロセスはすべてのリソースを解放し、その終了ステータスが親によって取得されるのを待機しています。親が子から終了ステータスを取得するためにwaitを実行しない場合、ゾンビになります。ゾンビの親を殺すと、initが終了ステータスを取得し、最終的にゾンビが死亡します。

1
unxnut