什么是僵尸进程?

     在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。

下面我们写一个脚本来模拟产生僵尸进程:

#include <stdio.h>
#include <sys/types.h> int main()
{
//fork a child process
pid_t pid = fork(); if (pid > 0) //parent process
{
printf("in parent process, sleep for one miniute...zZ...\n");
sleep(60);
printf("after sleeping, and exit!\n");
}
else if (pid == 0)
{
//child process exit, and to be a zombie process
printf("in child process, and exit!\n");
exit(0);
} return 0;
} #生成运行文件
[root@controller ~]# gcc zombie.c -o zombie
#运行
[root@controller ~]# ./zombie
in parent process, sleep for one miniute...zZ...
in child process, and exit!
#查看使用 ps 等命令查看系统中僵尸进程,僵尸进程的状态标记为‘Z’:
[root@controller ~]# ps aux|grep defunct
root 83895 0.0 0.0 0 0 pts/0 Z+ 20:37 0:00 [zombie] <defunct>
root 83909 0.0 0.0 112660 972 pts/1 S+ 20:38 0:00 grep --color=auto defunct #如何杀死僵尸进程
[root@controller ~]# kill 83895
[root@controller ~]# ps aux|grep defunct
root 83895 0.0 0.0 0 0 pts/0 Z+ 20:42 0:00 [zombie] <defunct>
root 83909 0.0 0.0 112660 972 pts/1 S+ 20:42 0:00 grep --color=auto defunct #我们发现如果使用kill 【pid】 无法杀死僵尸进程,可以kill僵尸父进程。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
[root@controller ~]# ps -e -o ppid,stat|grep -e '[Zz]'|awk '{print $1}'|xargs kill -9
[root@controller ~]# ./zombie
in parent process, sleep for one miniute...zZ...
in child process, and exit!
Killed

如何避免僵尸进程的产生

  处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程或者用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。

linux僵尸进程的更多相关文章

  1. Linux 僵尸进程查杀

    僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...

  2. Unix/Linux僵尸进程

    1. 僵尸进程的产生: 一个进程调用exit命令结束自己生命的时候,其实它并没有真正的被销毁,而是留下一个称为“僵尸进程”的数据结构.这时它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度 ...

  3. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  4. 转载 linux 僵尸进程,讲的很透彻

    僵尸进程的产生和避免,以及wait,waitpid的使用 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitp ...

  5. Linux 僵尸进程如何处理

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  6. linux僵尸进程产生的原因以及如何避免产生僵尸进程

    给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...

  7. 查看linux僵尸进程

    top ps -A -o stat,ppid,pid,cmd | grep -e '^[zZ]' kill -HUP 进程号

  8. linux 僵尸进程查看方式

    ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]' # 结果 Z 169925 49893 [sw] <defunct> Z 169925 120690 ...

  9. Linux 僵尸进程的筛选和查杀

    一.筛选 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' 二.查杀 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' ...

随机推荐

  1. [PHP] 编译构建最新版PHP源码

    获取最新PHP代码git clone https://git.php.net/repository/php-src.git构建编译环境apt-get install build-essential 编 ...

  2. Postman基本使用——get、post请求、断言、环境变量

      Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 它提供功能强大的 Web API & HTTP 请求调试. 它能够发送任何类型的HTTP 请求 (GET, ...

  3. Java多线程学习开发笔记

    线程有有序性和可见性 多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现. 在多个线程之间共享类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线 ...

  4. Zigbee Class 直播公告2016-10-10

    周一我们将开始本期课程的首次直播, 详情如下: 场次 第一场 阶段 入门 开始时间 2016-10-10  19:00 结束时间 不定 斗鱼地址 douyu.com/zigbeeclass 内容 本期 ...

  5. javascript 指定绑定函数名称,并且传递参数

      <html> <head> <title> New Document </title> <script type="text/jav ...

  6. GBK,UTF8是什么?有什么区别,做网站选择哪种好?

    GBK包含全部中文字符: UTF-8则包含全世界所有国家需要用到的字符. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准) UTF-8编码的文字可以在各国各种支持 ...

  7. 4种常用扒站工具(webzip、ha_TeleportPro、Offline Explorer、wget)

    许多开始做lead,EMU的新手,需要一个英文网站,找人定制费用太贵自己又不会技术的话,可以通过扒站来获得英文站,今天给大家介绍几种扒站工具: 1.HA_TeleportPro: Teleport P ...

  8. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条 1 http://www.abc.com/test.mp3&quo ...

  9. 面试官最爱的volatile关键字

    在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性 ...

  10. Oracle实战笔记(第四天)

    导读 今天的主要内容是:两个管理员用户sys&system.数据库的逻辑备份和逻辑恢复.数据字典.表空间&数据文件. 一.Oracle数据库管理员的职责(了解) 数据库管理员(dba) ...