9

ゾンビプロセスを強制終了する方法はありますか? プロセスを強制終了するために呼び出し、プロセスにシグナルをexit送信しようとしましたが、プロセスを強制終了することはできないようです。SIGINT私はLinux用にプログラミングしています。

4

6 に答える 6

11

ゾンビプロセスはすでに死んでいるので、殺すことはできず、刈り取ることができるだけです。これは、を介して親プロセスによって実行される必要がありますwait*()。これは通常、次child reaperのシグナルハンドラではイディオムと呼ばれSIGCHLDます。

while (wait*(... WNOHANG ...)) {
    ...
}
于 2011-06-13T20:13:57.970 に答える
4

これは、すべてのゾンビプロセスを強制終了するために作成したスクリプトです。GDBデバッガーを使用して親プロセスに接続し、waitpidを送信してゾンビプロセスを強制終了します。これにより、親はライブのままになり、ゾンビのみが殺されます。

GDBデバッガーをインストールする必要があり、プロセスにアタッチするためのアクセス許可を使用してログインする必要があります。これはCentos6.3でテストされています。

#!/bin/bash
##################################################################
# Script: Zombie Slayer
# Author: Mitch Milner
# Date:   03/13/2013 ---> A good day to slay zombies
#
# Requirements: yum install gdb
#               permissions to attach to the parent process
#
# This script works by using a debugger to
# attach to the parent process and then issuing
# a waitpid to the dead zombie. This will not kill
# the living parent process.
##################################################################

clear
# Wait for user input to proceed, give user a chance to cancel script
echo "***********************************************************"
echo -e "This script will terminate all zombie process."
echo -e "Press [ENTER] to continue or [CTRL] + C to cancel:"
echo "***********************************************************"
read cmd_string
echo -e "\n"

# initialize variables
intcount=0
lastparentid=0

# remove old gdb command file
rm -f /tmp/zombie_slayer.txt

# create the gdb command file
echo "***********************************************************"
echo "Creating command file..."
echo "***********************************************************"
ps -e -o ppid,pid,stat,command | grep Z | sort | while read LINE; do
  intcount=$((intcount+1))
  parentid=`echo $LINE | awk '{print $1}'`
  zombieid=`echo $LINE | awk '{print $2}'`
  verifyzombie=`echo $LINE | awk '{print $3}'`

  # make sure this is a zombie file and we are not getting a Z from
  # the command field of the ps -e -o ppid,pid,stat,command
  if [ "$verifyzombie" == "Z" ]
  then
    if [ "$parentid" != "$lastparentid" ]
    then
      if [ "$lastparentid" != "0" ]
      then
        echo "detach" >> /tmp/zombie_slayer.txt
      fi
    echo "attach $parentid" >> /tmp/zombie_slayer.txt
    fi
    echo "call waitpid ($zombieid,0,0)" >> /tmp/zombie_slayer.txt
    echo "Logging: Parent: $parentid  Zombie: $zombieid"
    lastparentid=$parentid
  fi
done
if [ "$lastparentid" != "0" ]
then
  echo "detach" >> /tmp/zombie_slayer.txt
fi

# Slay the zombies with gdb and the created command file
echo -e "\n\n"
echo "***********************************************************"
echo "Slaying zombie processes..."
echo "***********************************************************"
gdb -batch -x /tmp/zombie_slayer.txt
echo -e "\n\n"
echo "***********************************************************"
echo "Script complete."
echo "***********************************************************"

楽しみ。

于 2013-03-14T20:55:56.323 に答える
2

ゾンビ プロセスは、親プロセスがまだ待機していないプロセス ID (および関連する終了ステータスとリソース使用情報) です。それを排除する唯一の方法は、親にそれを待機させることです (SIGCHLD親にバグがあり、待機する機会を逃した競合状態があった場合、手動で親に送信することでこれを達成できる場合があります)。親を強制的に終了しない限り、運が悪いです。

編集:もう 1 つの方法は、絶望的で親を殺したくない場合は、gdb を使用して親にアタッチしwaitpid、ゾンビの子を強制的に呼び出すことです。

于 2011-06-13T20:11:27.700 に答える
1

kill -17 ZOMBIE_PID

また

kill -SIGCHLD ZOMBIE_PID

おそらくうまくいくでしょうが、他のみんなが言ったwait()ように、親が刈り取りをせずに死なない限り、親がそう呼ぶのを待っています。

于 2011-06-13T20:18:12.673 に答える
0

私の記憶が正しければ、ゾンビ プロセスの親を強制終了すると、ゾンビ プロセスが停止します。

ps faux親/子関係を示す、実行中のプロセスの素敵な階層ツリーを取得するために使用します。

于 2011-06-13T20:11:18.220 に答える
-2

unix-faqs「永続的なゾンビプロセスを取り除くにはどうすればよいですか?」を参照してください。

ゾンビはすでに死んでいるので、殺すことはできません。ただし、ゾンビが多すぎる場合は、親プロセスを強制終了するか、サービスを再起動してください。

あなたはそのpidを使用してゾンビプロセスを殺すことを試みることができます

kill -9 pid

kill -9は、ゾンビプロセスを強制終了することを保証するものではないことに注意してください

于 2011-06-13T20:12:11.753 に答える