linux中的僵尸进程

原创 2016年11月20日 21:39:46

如果一个进程已经退出或者被杀死,但是它的父进程尚未执行wait操作,那么该进程进入僵尸(zombie)状态。这种进程不再参与调度,它的内存也会被释放,但系统不会把它从进程表中删除(top 命令中显示状态为Z)。僵尸在进程等待父进程回收它的退出状态。

原文:小宇的博客

这篇文章会告诉你:
1. 僵尸进程产生原理。
2. 如何产生僵尸进程。
3. 如何回收僵尸进程。

产生僵尸进程

根据僵尸进程的定义,我们不难用c语言来产生一个僵尸进程

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MB 1024*1024

int main()
{

    int pid;

    printf("new process PID=%d\n", getpid());
    pid = fork();
    if(pid==0)
    {   
        /* child */
        printf("new process PID=%d\n", getpid());
        char * p = malloc(512*MB);
        memset(p,0,512*MB);
        exit(0);
    }   
    else
    {   
        /* parent */
        sleep(60);
    }   
}      

编译并执行该程序,然后再看该程序进程的状态:

$ ./main 
new process PID=25810
new process PID=25811

$ ps aux | grep main
yshen    25810  0.0  0.0   4200   620 pts/31   S+   14:30   0:00 ./main
yshen    25811  0.0  0.0      0     0 pts/31   Z+   14:30   0:00 [main] <defunct>

可以看到,主进程的状态为S+即休眠状态,子进程的状态为Z+即僵尸状态。此时僵尸进程等待父进程读取其退出状态。在该程序中等待父进程退出之后,子进程也将退出(因为子进程的状态在父进程退出之后已经没什么用了)。

用top命令来查看内存占用情况,可以看到实僵尸进程的内存占用等于0.

$ top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
25810 yshen     20   0    4200    792    712 S   0.0  0.0   0:00.00 main
25811 yshen     20   0       0      0      0 Z   0.0  0.0   0:00.67 main

处理僵尸进程

根据以上分析,我们不难得出僵尸进程退出的2种情况:
1. 父进程用wait/waitpid来获取子进程的状态。
2. 父进程退出。

子进程退出,也会给父进程发送SIGCHLD信号来通知。在实际编码中,一般应SIGCHLD信号进行处理。(如:重新fork拉起子进程或进行垃圾回收,记录日志等等)。如下例子我们注册SIGCHLD信号处理函数,等待子进程退出时由父进程调用wait来获取其退出状态。

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>

void handler(int code)
{
    int status;
    pid_t pid = wait(&status);
    printf("parent get SIGCHLD, child %d returned %d\n",
                                    pid, WEXITSTATUS(status));
    sleep(60); /* 加这行是因为父进程收到SIGCHLD信号打断了原来的sleep,如果不加这个父进程就会马上退出 */
}

int main()
{

    int pid;
    signal(SIGCHLD,handler);

    printf("new process PID=%d\n", getpid());
    pid = fork();

    if(pid==0)
    {
        /* child */
        printf("new process PID=%d\n", getpid());
        exit(123);
    }
    /* parent */
    sleep(60);
    exit(0);
}

编译并执行。

$ ./main 
new process PID=26559
new process PID=26560
parent get SIGCHLD, child 26560 returned 123

$ ps aux | grep main
yshen    26604  0.0  0.0   4200   624 pts/31   S+   15:07   0:00 ./main

可以看到,已经没有僵尸进程了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux下如何防止僵尸进程的出现

今天碰到一个老问题,就是防止僵尸进程的出现,于是又在网上学习了一遍,写到这里,防止以后不再有一个地方重新学习,:)一、什么是僵尸进程这个首先要了解一下linux下的进程在结束的时候会做什么事情。lin...
  • u011801189
  • u011801189
  • 2016年04月29日 18:09
  • 1319

在Linux中,如何找到并杀掉僵尸进程?

如果你经常使用 Linux,你应该遇到这个术语“僵尸进程Zombie Processes”。 那么什么是僵尸进程? 它们是怎么产生的? 它们是否对系统有害? 我要怎样杀掉这些进程? 下面将会回答这些问...
  • DP29syM41zyGndVF
  • DP29syM41zyGndVF
  • 2017年12月18日 00:00
  • 269

linux下的僵尸进程产生原因和解决方法(含具体代码)

在linux系统中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表中仍占了一个位置。由于进程表的容量...
  • LEON1741
  • LEON1741
  • 2017年09月30日 14:14
  • 669

linux下避免僵尸进程的几种方法

linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间、堆、栈......副本(采用写时复制机制),子进程将会继承父进程的信号掩码、信号处理方式、当前工作目录、会话id、...
  • ComingFlying
  • ComingFlying
  • 2017年08月05日 14:52
  • 314

Linux的僵尸进程产生原因及解决方法

来源:http://www.blogdaren.com/post-882.html 1. 产生原因:     在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait ...
  • gb4215287
  • gb4215287
  • 2016年07月08日 00:02
  • 3477

linux上寻找并杀死僵尸进程

linux服务器上,多少会出现一些僵尸进程,下面介绍如何快速寻找和消灭这些僵尸进程的方法 首先,我们可以用top命令来查看服务器当前是否有僵尸进程,在下图中可以看到僵尸进程数的提示,如果数字大于...
  • shanzhizi
  • shanzhizi
  • 2015年08月06日 17:50
  • 7628

linux 如何清理僵尸进程

转载自:http://www.cnblogs.com/yuxc/archive/2012/11/04/2753391.html 今天在维护服务器的时候,发现有5个nova-novnc...
  • xiong_mao_1
  • xiong_mao_1
  • 2014年01月08日 10:25
  • 1130

【Linux】僵尸进程的检测,清理和避免

一.僵尸进程的产生一个进程终止的方法很多,进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。因此进程在终止时,回收所有内核分配给它的内存、关闭它...
  • jiange_zh
  • jiange_zh
  • 2015年12月19日 10:27
  • 2937

Linux 下僵尸进程的清理方法

平时很多时候发现定时检测的脚本kill 之后,该进程会僵死在里面,无法清理。可以参考下面的方法清理:有以下环境的进程:#ps aux |grep monitorast.plroot      3962...
  • radkitty
  • radkitty
  • 2010年03月29日 11:01
  • 6177

Linux环境下如何杀死僵尸进程

我们在使用top命令查看主机性能的的时候会在第二行会查看到有zombie关键字,此关键字代表僵尸进程的意思。僵尸进程:在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / wa...
  • lufeisan
  • lufeisan
  • 2016年10月30日 16:38
  • 593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux中的僵尸进程
举报原因:
原因补充:

(最多只允许输入30个字)