殭屍進程如何有效解決

轉載自:https://blog.csdn.net/u011123091/article/details/81220827

殭屍進程(Zombie process)通俗來說指那些雖然已經終止的進程,但仍然保留一些信息,等待其父進程爲其收屍。也就是說父進程沒有結束,但是子進程結束了,父進程沒死,沒辦法給子進程收屍,真的是隻有父進程死了才能收屍,哈哈,同時也沒有顯示的調用wait/waitpid給其子進程收屍。當然,父進程提前死亡,子進程會交給init進程,所以收屍的問題就交給init進程了。百度百科的殭屍進程說的很好,可以看一下!

一,在linux下生成一個殭屍進程的c代碼

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <linux/wait.h>
int main(int argc,char **argv)
{
        int i=0;
        pid_t pid=fork();
        if(pid==-1) return 0;
        else if(pid==0)
        {
                printf("son pid is %d\n",getpid());
                while(1)
                {
                        printf("son---i=%d\n",i);
                        i++;
                        sleep(1);
                        if(i==5)
                        break;
                }
                printf("son is over!\n");
        }else if(pid>0)
        {
                printf("parent pid is %d\n",getpid());
                while(1) sleep(100);
        }
        return 0;

}

這樣就是在子進程已經結束,但是父進程永遠也不會結束,也沒有調用wait/waitpid。那麼子進程就成爲殭屍進程。

編譯,gcc makeDefunct.c -o makeDefunct

我的文件名是makeDefunct.c  運行./makeDefunct

二、如何查看殭屍進程

可以利用top命令,效果如下,上文中創建的殭屍進程

可以發現我的服務器下只有一個殭屍進程。

也可以用 ps -aux |grep Z 來查看殭屍進程,效果如下:

殭屍進程的狀態顯示的是Z

三、如何殺死殭屍進程

從殭屍進程的概念可以看出,父進程沒有結束導致的,我們把父進程殺死,父進程就會尋找他自己創建的子進程,從而殺死殭屍進程。所以我們要殺死父進程就可以。所以第一步要找到父進程 ps -ef | grep defunct_process_pid(殭屍進程pid)  然後執行,kill -s 9 父進程的pid。演示如下:

可以看出,先找到殭屍進程的pid,我這裏使用ps -aux |grep make 是因爲我的c文件是make開頭的。然後在找到殭屍進程的父進程的pid  11781

然後殺死 kill -s 9 11781

檢查一下是否殺死了殭屍進程

執行top後得到的結果如下圖:

沒有殭屍進程了已經被殺死了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章