2012-12-02 156 views
0

我必須殺死/清除linux C中的殭屍進程。我所知道的只是殭屍的PID。殺死殭屍進程,瞭解linux中的PID C

我在一個循環中創建一些殭屍進程:

int i = 0; 
for (i; i<5; i++) 
{ 
    system("(: & exec sleep 30) &"); // create zombie for 30 sec 
} 

我可以用得到他們的PID號:

system("ps aux | awk '{ print $8 " " $2 }' | grep -w Z"); 

但怎麼殺/潔淨他們只使用PID? 我節省了PID在一個變量和標準信號:

kill(PID,9) 

甚至不工作,因爲這個過程是已經死了。 任何其他方式來實現它?請不要問我爲什麼我會創造殭屍來殺死他們。情況並非如此。

+1

殺死父母 – 2012-12-02 13:16:40

+1

閱讀:http://www.linuxsa.org.au/tips/zombies.html – Thomas

+0

@Rajesh我沒有家長的PID,使用bash來創建。 – krzakov

回答

3

這裏是我創建殺死所有殭屍進程的腳本。它使用GDB調試器附加到父進程併發送waitpid來殺死殭屍進程。這會讓父母生活,只會殺死殭屍。

GDB調試器將需要安裝,您將需要登錄並具有附加到進程的權限。這已在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 "***********************************************************" 

享受。

+1

如果您可以準確地*發佈*兩個問題的相同答案,那麼這表明問題是重複的。而不是發佈第二個答案,您應該標記(或投票)以重複關閉。 – ChrisF

3

「殭屍」是一個已經死亡的過程。你不能再殺了它。

「殭屍」實際上只是包含進程退出狀態的進程表中的一個條目。爲了擺脫它,父進程必須調用wait()來檢索該信息。或者,父進程可以退出;那麼這個孩子就變成了一個所謂的「孤兒」,並被init採納,ID爲1的過程。init自動收回所有死亡的孩子。

+0

但如何去做。我沒有父母的PID。我使用bash來創建殭屍。 – krzakov

+0

爲什麼不簡單地停止創建殭屍呢? – melpomene

+0

因爲我的客戶想要擁有它們。這有點麻煩,但我必須創建一個刪除它們。 – krzakov

2

你是正確的,你不能殺殭屍,因爲他們已經死了。

他們是殭屍的原因是因爲該過程已經結束,但父母還沒有收穫退出代碼。

最終,init應該爲你做這個,如果和當殭屍成爲孤兒。一個真正的殭屍,仍然有父母但父母還沒有到收穫的退出代碼的過程,將持續直到:

  • 收穫退出代碼;或
  • 父母退出時它變成孤兒。
+0

必須是一種清理這個混亂的方法。 – krzakov

1

你在做什麼似乎很扭曲。我假定你已經試圖創建一個最小的測試用例來展示更廣泛的問題並且答案 - 當羽毛進程不乾淨(調用waitpid和朋友)其子進程資源時創建一個殭屍。

因此,無論是正確寫父進程代碼來響應SIGCHLD並調用waitpid,或者,如果您無法控制父進程,正如我在這裏猜測的那樣,殺死父進程(發送SIGTERM到父親)。

後者工作的原因是所有無父母的孩子重新參與初始化(PID 1),這將執行所需的清理。

+0

我真的沒有父母的PID。你建議殺死init進程? – krzakov

+0

@krzakov,不要考慮考慮嘗試殺死init進程的可能性。 – paxdiablo

+0

你的建議呢? – krzakov

0

您可以嘗試使用SIGCHLD signal.For例如,在C:

signal(SIGCHLD, handleSIGCHLD); 


    void handleSIGCHLD(int signum) { 
    int stat; 

/*Kills all the zombie processes*/ 
    while(waitpid(-1, &stat, WNOHANG) > 0); 
} 
+0

但在我的程序中,我必須通過他的PID殺死殭屍。不是所有的人。 – krzakov

+0

@krzakov你不能殺死殭屍;他們已經死了。 – melpomene

+0

哦,cmon。殺死/清理任何東西。 – krzakov