1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #!/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 "***********************************************************" |