php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡
声明:维基百科上没有僵死进程的词条,这里认为僵死进程同僵尸进程,即ZOMBIE。
一、定义
什么是僵尸进程
维基百科的定义:在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于”终止状态”的进程。
这个定义很准确,但并不好理解,通俗的说法是一个进程fork了一个子进程,子进程先于父进程退出,但父进程没有调用wait(通过wait系统调用读取退出进程的退出态,退出进程的在进程表中的表项就被删除),导致这个进程已经退出但是仍在进程表中占有一个位置,这种进程称为僵尸进程。
什么是孤儿进程
孤儿进程:一个进程fork了一个子进程, 父进程先于子进程退出,运行中的子进程称为孤儿进程。
孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
下面,让我们来看2个示例:
二、僵尸进程示例
0、通过swoole在一个进程中创建子进程,让子进程先于父进程退出。
echo 'ppid = ' . getmypid(), PHP_EOL;
$process = new swoole_process(function (swoole_process $worker) {
echo 'pid = ' . getmypid(), PHP_EOL;
sleep(10);
echo 'child process exit', PHP_EOL;
}, false);
$process->start();
sleep(1000);
echo 'parent process exit', PHP_EOL;
1、以上代码保存文件zombie.php, 执行
[root@salmonl process]# php zombie.php
ppid = 4899
pid = 4900
child process exit
2、另开一个窗口查看进程
# 子进程退出前
$ ps aux | grep -v 'grep' | grep 'zombie'
root 4899 0.3 0.6 321644 24612 pts/0 S+ 16:07 0:00 php zombie.php
root 4900 0.0 0.2 321644 8956 pts/0 S+ 16:07 0:00 php zombie.php
# 子进程退出后
$ ps aux | grep -v 'grep' | grep 'zombie'
root 4899 0.0 0.6 321644 24612 pts/0 S+ 16:07 0:00 php zombie.php
# 查看僵尸进程(状态为Z, 或者COMMAND中出现defunct)
$ ps aux | grep -v 'grep' | grep 'defunct'
root 4900 0.0 0.0 0 0 pts/0 Z+ 16:07 0:00
3、kill僵尸进程无效
$ kill 4900
$ ps aux | grep -v 'grep' | grep 'defunct'
root 4900 0.0 0.0 0 0 pts/0 Z+ 16:07 0:00
4、kill父进程,僵尸进程就会消亡
$ kill 4899
$ ps aux | grep -v 'grep' | grep 'defunct'
三、孤儿进程示例
0、通过swoole在一个进程中创建子进程,让父进程先于子进程退出。
echo 'ppid = ' . getmypid(), PHP_EOL;
$process = new swoole_process(function (swoole_process $worker) {
echo 'pid = ' . getmypid(), PHP_EOL;
sleep(1000);
echo 'child process exit', PHP_EOL;
}, false);
$process->start();
sleep(10);
echo 'parent process exit', PHP_EOL;
1、以上代码保存文件orphan.php, 执行
$ php orphan.php
ppid = 5041
pid = 5042
parent process exit
2、另开一个窗口查看进程
# 父进程退出之前,进程状态
$ ps aux | grep -v 'grep' | grep 'orphan'
root 5041 0.5 0.6 321644 24612 pts/0 S+ 16:22 0:00 php orphan.php
root 5042 0.0 0.2 321644 8956 pts/0 S+ 16:22 0:00 php orphan.php
# 父进程退出之后进程状态(子进程的ppid变为1)
$ ps -ef | grep -v 'grep' | grep orphan
root 5042 1 0 16:22 pts/0 00:00:00 php orphan.php
四、总结
0、swoole中避免出现僵尸进程,在父进程中调用wait即可
while ($res = swoole_process::wait()) {
echo PHP_EOL, 'worker process exit pid: ' . $res['pid'] . PHP_EOL;
}
1、僵尸进程占用进程ID,多了之后,影响进程调度。
2、清除僵尸进程可通过清除父进程,或者等待很长时间后被内核清除。
php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡相关推荐
- 【Linux】进程概念——父子进程、僵尸进程和孤儿进程
目录 父子进程 什么是父子进程? ==父子进程特性== 为什么有父子进程? 僵尸进程(defunct进程) 什么是僵尸进程? 僵尸进程的底层原因 僵尸进程的危害与解决方法 孤儿进程 什么是孤儿进程? ...
- 启动进程 问号_有两个这样的进程:僵尸进程amp;孤儿进程,蓝瘦香菇
进程 先来说下什么是进程: 来看下百度是怎么说的: 光看说的不够形象,在windows系统中,它长这样: 在Mac系统中,它长这样: Linux中是这样的:(有点长截图一部分好了) [root@iz2 ...
- delphi pid判断进程结束_有两个这样的进程:僵尸进程amp;孤儿进程,蓝瘦香菇
进程 先来说下什么是进程: 来看下百度是怎么说的: 光看说的不够形象,在windows系统中,它长这样: 在Mac系统中,它长这样: Linux中是这样的:(有点长截图一部分好了) [root@iz2 ...
- java 僵尸进程_孤儿进程与僵尸进程
开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...
- 什么是僵尸进程与孤儿进程
1.什么是僵尸进程和孤儿进程: 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束.当一个进程调用 exit 命 ...
- Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)
进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...
- python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程
一.python如何使用多进程 创建子进程的方式 1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target import os from multip ...
- python僵尸进程和孤儿进程_python学习笔记——孤儿进程和僵尸进程
1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...
- 僵尸进程和孤儿进程 转载
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用f ...
最新文章
- 吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义 | AI ProCon 2019
- 大话设计模式(九 反射——程序员的快乐!)
- cf600 E. Lomsat gelral
- tomcat6的项目能直接在tomcat7上用吗_极尽人性化的设计: 能“隐形”的笔记本电脑支架...
- 对话框大小与像素关系
- 通用汽车CES官宣电动皮卡 追赶福特、Rivian
- C++智能指针的“GC”
- DeepMind研究科学家:NLP基准测试的现在、过去和未来
- Tomcat—HTTPS之生成密钥库文件与配置Tomcat服务器
- 安卓rom制作教程_【教程】一加5/5T刷入第三方ROM教程
- 苹果手机怎么投影到墙上_手机怎么投屏到投影仪上?这篇图文教程教你轻松搞定...
- MATLAB线性回归
- 爱河许云上计算机乐谱,爱河简谱(歌词)-神马乐团演唱-桃李醉春风记谱
- win10输入法不能切换_Win10升级后中英文输入法无法切换?一个简单设置,10秒轻松搞定...
- Elsevier论文模板没有author biography的解决办法
- slideup_jQuery slideUp,slideDown,slideToggle
- 快速制作一个chrome插件
- oracle-临时表
- UE4源码阅读_骨骼模型与动画系统_Mesh
- 网易云课堂学习-zk集群
热门文章
- 调试 ASP.NET Core 2.0 源代码
- 终于知道什么情况下需要实现.NET Core中的IOptions接口
- 离线安装 VS2017 的正确姿势
- Rider IDE恢复了对.NET Core调试的支持
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
- 跨站请求伪造(CSRF/XSRF)
- win10系统按esc会弹出计算机,win10系统版本2004控制面板多出ESC是什么原因?
- 利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示
- 【C#程序设计】教学讲义——第一章:C#语言概述
- 【VB测绘程序设计】第二章 VB测绘程序基础