kill不掉的僵尸进程~
2023-04-18 16:12:55 时间
看到一个有意思的名字“僵尸进程”,然后看了下他的含义
百度百科:僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源
一 .如何杀死僵尸进程
对于我们开发人员来说有问题要先解决了再说,怎么杀死僵尸进程呢。 1、ps -aux,看看哪个进程STAT为Z,哪个就是僵尸进程
2、ps -ef |grep 僵尸进程ID (第三列的PPID就是父id)或者pstree -aps 僵尸进程id 查看进程树关系,找到父进程ID,然后先杀死父进程即可
二 .怎样来清除僵尸进程
- 1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后, 会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略, 如果想响应这个消息,可以设置一个处理函数。
- 2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程,关机或重启后所有僵尸进程都会消失。
三 .如何避免僵尸进程
僵尸进程的避免
- ⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
- ⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
- ⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
- ⒋ 还有一些技巧,就是fork两次; APUE上的fork两次的做法,是针对父进程fork有限次后终止的简单情况。父进程A专门fork一个子进程B,然后这个子进程fork创建N个子进程(不调用wait,所以会变成僵尸进程)后终止。子进程终止后,这N个僵尸进程失去了父进程B,所以成为了孤儿进程,被init进程收养,从而寿终正寝。这种做法本质还是和我之前的实验中手动kill父进程一样。
相关文章
- 微软员工薪资曝光:软件工程师年薪中位数 18.5 万美元,三类岗位挣钱最少
- Webots2021b和ROS2调试笔记21-07-29
- 惋惜!90后游戏开发大神毛星云离世
- 90后游戏开发大神毛星云跳楼自杀!8年执着国产3A梦碎
- 域名注册网站建设方案 域名注册的几个要点
- 互联网大厂的AB面:一边裁员一边福利升级
- 软件开发架构模式浅谈:一些思考和实践记录
- 为何机器人仿真如此复杂?可否简化节省宝贵时间?
- 【Python100天学习笔记】Day13 进程和线程
- 骁龙8四倍AI算力硬科技:上可超分下可增强信号,多个算法同时跑
- 【Python100天学习笔记】网络编程和应用开发
- 云服务器怎么建设网站 云服务器的种类
- ROS2(Win10)更新记录21-07-27
- 云服务器怎样建设网站 云服务器的优势
- 女神青涩时纤毫毕现!腾讯AI模型GFPGAN火上GitHub热榜第一
- ROS之choro功能包
- 如何快速解决Github下载源码编译报错并顺利运行机器人等项目案例(Webots+ROS2)
- RDPWrap1.6.2让windows家庭版Home实现远程桌面
- ROS 2 Humble Hawksbill将于2022年5月发布
- 【公益分享】炼石计划企业级JavaWeb漏洞挖掘实战之第二期基于SpringBoot架构的办公OA系统漏洞挖掘