zombie process can't be killed

前端 未结 6 763
北海茫月
北海茫月 2021-01-02 08:41

Is there a way to kill a zombie process? I\'ve tried calling exit to kill the process and even sending SIGINT signal to the process, but it seems t

6条回答
  •  Happy的楠姐
    2021-01-02 09:22

    Here is a script I created to kill ALL zombie processes. It uses the GDB debugger to attach to the parent process and send a waitpid to kill the zombie process. This will leave the parent live and only slay the zombie.

    GDB debugger will need to be installed and you will need to be logged in with permissions to attach to a process. This has been tested on Centos 6.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 "***********************************************************"
    

    Enjoy.

提交回复
热议问题