目录

1 前言

2 僵尸进程

2.1 进程简介

2.2 僵尸进程例子

2.3 僵尸进程危害

3 处理僵尸进程

3.1 kill 命令

3.2 kill 父进程

3.3 reboot

3.4 magic sysrq key 方法

1 前言

在 centos7 跑 Docker 和 k8s 时,偶尔会出现 systemctl 失效的情况,现象如下:Failed to get properties...

查看系统进程,发现僵尸进程(zombie/defunct):ps -ef | grep defunct

2 僵尸进程

2.1 进程简介

在 linux 中,父进程通过 fork 调用创建子进程。

子进程执行完毕之后,内核会释放该子进程所占用的资源,包括打开的文件,占用的内存等,但仍然会在进程表中保留一个槽位(slot)存放该子进程的文件描述符(比如进程PID、进程退出状态、进程运行时间等),直到父进程发送 wait() 或 waitpid() 调用,内核才会把子进程文件描述符从进程表中彻底清除。如果父进程不调用 wait() 或 waitpid()对子进程进行清理,那子进程将处于僵尸状态。

但是如果父进程先于子进程结束的话,会导致子进程变成僵尸进程吗?答案是不会。因为每当进程结束的时候,系统都会扫描当前所有运行的进程,查找是否有这个结束进程的子进程,如果有,就由 init 进程(或者 systemd 进程)来接管子进程,成为子进程的新父进程,并自动 wait 这个子进程,确保以后该子进程不会变成僵尸进程。

2.2 僵尸进程例子

下面展示一个 c 语言编写的僵尸进程样例,样例中主进程并不会 wait 子进程,生成文件 zombie.c:#include

#include

#include

int main(void)  {

int i = 60;

pid_t pid = fork();

if ( pid < 0 )  {

perror( "fork error." );

exit(1);

}

if ( pid == 0 ) {

printf( "This is the child process. My PID is: %d. My PPID is: %d\n", getpid(), getppid() );

}

if (pid > 0)    {

printf( "This is the parent process. My PID is %d.\n", getpid() );

for( ; i > 0; i-- ) {

sleep(1);

}

}

return 0;

}

编译 zombie.c 并执行 zombie:yum install gcc

gcc zombie.c -o zombie

./ zombie

上图中主进程 PID:11552,子进程 PID:11553。执行如下语句:发现 PID 为 11553 的子进程正好处于僵尸状态(defunct),由程序可知,因为主进程并没有 wait 子进程。ps aux | grep -i defunct

        分析一下 zombie.c,特别注意 fork() 调用,在 pid_t pid = fork() 语句之前,只有一个进程,但是执行到这条语句之后,就变成2个进程了,这2个进程几乎完全相同,将要执行的下一条语句都是 if ( pid < 0 )。

fork() 函数比较特殊,它被调用一次,却能够返回两次结果,它的返回值也根据进程的不同而不同:1)在父进程中,fork 返回新创建子进程的 PID

2) 在子进程中,fork 返回 0

3)如果出现错误,则 fork 返回负值

2.3 僵尸进程危害

如果父进程没有 wait 子进程,子进程将变成僵尸状态,处于僵尸状态的进程将保留进程号(PID),众所周知,操作系统对进程号是有限制的,如果出现大量僵尸进程占用进程号,系统有可能无法创建新的进程。

3 处理僵尸进程

一般情况下处于僵尸状态的进程很难杀掉,当然你可以试着删除:

3.1 kill 命令kill -9 PID

3.2 kill 父进程kill -9 PPID

3.3 reboot

如果采用上面两种方式依然杀不掉,那么只能通过重启了。reboot

如果重启也不生效,可以需要加选项 -nfreboot -nf

3.4 magic sysrq key 方法

有时执行 reboot 命令还是无法重启,可以执行 magic sysrq 方法来通过提供给用户的 proc 接口直接向 kernel 发底层命令。

重启命令如下:echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

强制关机命令:echo 1 > /proc/sys/kernel/sysrq

echo b > /proc/sysrq-trigger

c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程相关推荐

  1. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  2. 基于pbl的c语言课程设计及学习指导 答案,基于PBL的C语言课程设计及学习指导前三章答案1.0版...

    <基于PBL的C语言课程设计及学习指导前三章答案1.0版>由会员分享,可在线阅读,更多相关<基于PBL的C语言课程设计及学习指导前三章答案1.0版(67页珍藏版)>请在人人文库 ...

  3. C语言学习1——第一、二、三章学习记录

    总述 大一新生开始学习c语言,记录一下学习过程,本人看的是谭浩强老师的C程序设计,在写这个博客之前已经学习了前三章,这一篇就给前三章做一个总结和记录学习. 注:本博客所有知识点均出自C程序设计(第五版 ...

  4. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  5. C语言深度剖析书籍学习记录 第三章 预处理

    宏 _LINE_ 表示正在编译的文件的行号 _FILE_ 表示正在编译的文件的名字 _DATE_ 表示编译时刻的日期字符串,例如: "25 Dec 2007" _TIME_ 表示编 ...

  6. 学习C语言必须知道的理论知识(第三章-C语句)

    一个函数包括:声明部分和执行部分. C语言的分类: 1.控制语句 控制语句分为9种:1.if()...else...    (条件语句) 2.for()...            (循环语句) 3. ...

  7. 【最详细】数据结构(C语言版 第2版)第三章课后习题答案 严蔚敏 等 编著

    所有章节答案合集-->传送门 1.选择题 ( 1)若让元素 1, 2, 3, 4, 5 依次进栈,则出栈次序不可能出现在()种情况. A. 5, 4, 3, 2, 1 B. 2, 1, 5, 4 ...

  8. c语言第四版课后答案第三章3.4,算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章 习题参考答案...

    第3章 栈和队列 一.基础知识题 3.1 有五个数依次进栈:1,2,3,4,5.在各种出栈的序列中,以3,4先出的序列有哪几个.(3在4之前出栈). [解答]34215 ,34251, 34521 3 ...

  9. c语言 任意自然数的分解加法,第三章 1. 代数系,自然数,整数,有理数,实数,复数...

    群实质上是集合加上满足群公理的乘法运算的数学实体.现在我们将其推广,在集合上加上不同的附加结构(不同公理),研究可能形成的代数系及其性质. 一. 自然数 自然数$\mathbb{N}=\{0,1,2, ...

最新文章

  1. 性能测试初学_loadrunner base64/md5 编码 解码
  2. mysql中迅速插入百万条测试数据的方法
  3. Android Service与Activity的交互
  4. linux ubuntu 开机自动启动 fixfox 并打开指定网站
  5. 信息系统项目管理师 必背
  6. java 泛型 引用_Java嵌套自引用泛型
  7. 远程控制python
  8. 基础编程题目集 6-3 简单求和 (10 分)
  9. metinfo mysql off_利用Sqlmap测试MetInfo企业网站管理系统MySql注入漏洞
  10. 不可能解开的谜题 (程序员修炼之道,评注者序)
  11. 图像分割各种评测标准
  12. python爬虫之模拟登陆(CSDN篇)
  13. 高数习题第七章总练习题(下)
  14. 计算机组成原理头歌实验
  15. java定制化报表_定制自己的报表!7款实用开源报表工具
  16. 用牛顿法求算术平方根python
  17. marked is not a function问题解决
  18. 前端和后端的JSON数据交互
  19. 让人扎心的Nginx rewrite跳转及Location
  20. 只需这10招,强壮骨骼到老非你莫属

热门文章

  1. 0基础JavaScript入门教程(一)认识代码
  2. D3.js系列——初步使用、选择元素与绑定数据
  3. BM提供支持云的量子计算平台,以加速创新
  4. 前端开发之retina屏幕
  5. 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
  6. zabbix监控windows(03,08)
  7. OpenWebSpider 安装使用
  8. NumericUpDown
  9. glusterfs基本操作
  10. 了解大数据的特点、来源与数据呈现方式