在做稳定性测试时,发现某进程日志停了,也没有退出日志,也没有别的,就一顿操作,然后把进程搞成了僵尸进程 defunct 。(疑似是 gdb attach 时,pkill -9 该线程了)

试着 kill 9 ppid 。僵尸进程的父进程变成了1,但是僵尸进程还存在。

搜了下,找到这篇文章《父进程为1号进程(ppid=1)的僵尸进程处理和分析》

那当出现父进程为1号进程的僵尸进程时,需要分析时,可以考虑上面几种情况;

1、查看下当前这个僵尸进程是否被其他进程使用,比如:被跟踪,调试之类的;

2、用ps -T -p 查看下这个僵尸进程的主线程是否退出;

3、用strace 跟踪下这个僵尸进程看看是否有io在等待,或者查看下载僵尸之前是否有io类的操作发生;

想到这个进程在变成僵尸进程前,用 gdb attatch 试图找到进程出现的问题。

那是不是因为 gdb 还在调试此进程呢,pkill 9 gdb,再 ps -ef | grep defunct | grep -v grep 发现此进程已经被回收。

具体的问题也没排查出来,桑心!

====================== 以下是原文 ======================
首先是 父进程为1号进程的进程 会不会成为僵尸进程??

---------------------------------------普通进程------------------------------------------

普通进程,父进程不主动去回收子进程的资源。
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。产生僵尸进程的原因:
1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它;
2、父进程没有调用wait()或waitpid()函数来等待子进程的结束;

处理办法:把父进程杀掉,僵尸进程会变成孤儿进程,然后过继给1号进程,而1号进程会扫描名下子进程,把 Z 状态进程回收;

这时候僵尸进程已经退出了,只保留了task_struct结构体,所以发信号(-9等信号)去处理僵尸进程是无效的;

-----------------------------------ppid=1的进程-------------------------------

通过对普通僵尸进程的分析,这样看起来好像 父进程为1号进程的进程 不会成为僵尸进程了,因为1号进程都会时刻扫描其子进程的状态。

发现是 僵尸进程就会马上去释放它的资源;

但是,父进程为1号进程的进程 其实也是有可能成为僵尸进程的。下面说几种情况:

1、进程还在被其它进程使用,退出;

2、进程的子线程还在执行任务,但主线程已经死掉了(可能主线程已经被杀了,systemd停止服务时会发SIGTERM信号);

3、进程阻塞在某一IO请求上,这时控制权已交到内核手上,这时如果子进程被KILL掉, 那么就成为父进程ID为1的僵尸进程,这个进程不会退出,会一直阻塞直到IO请求被满足;

那当出现父进程为1号进程的僵尸进程时,需要分析时,可以考虑上面几种情况;

1、查看下当前这个僵尸进程是否被其他进程使用,比如:被跟踪,调试之类的;

2、用ps -T -p 查看下这个僵尸进程的主线程是否退出;

3、用strace 跟踪下这个僵尸进程看看是否有io在等待,或者查看下载僵尸之前是否有io类的操作发生;

-------------------------------------------------我的bug分析--------------------------------------------------

我查看了下这个僵尸进程在变成僵尸之前的进程状态,发现开始是Ssl,然后变成了 tsl (我们有专门日志记录ps 进程列表的);

这里贴下进程的状态说明:

D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换(从内核2.6开始无效);
X 死掉的进程(从来没见过);
Z 僵尸进程;

< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);

  • 位于后台的进程组;

还有个重要的信息,在ps列表中有栏START信息,表示进程的启动时间,这个比较重要,可以看出进程是在哪天的什么时候起来的。

根据上面贴的进程状态信息,可以知道进程从休眠状态变了停止/被追踪,再根据开始说的 ppid=1的进程如果在被其他进程使用(跟踪调试等),则退出时,会有部分信息残留,导致变成僵死进程;(我觉得我就是这个情况orz)

那就比较容易处理了,首先查看下是什么时间点变成tsl状态的,那就说明这个时间点该进程被跟踪(不知道这是不是黑客中提到的反调试,反追踪)了,在这个时间点开始查找下看看有没有进程调试跟踪该僵尸进程;

-----------------------------补充句--------------------------------------

其实ppid=1的僵尸进程可以不用去管他,因为它迟早会被1号进程回收的(如果有很多僵尸进程除外)。

并且绝大部分ppid=1的僵尸进程是暂时的:

1、当进程被跟踪调试完,则会自动被回收掉的;

2、其他子线程组的线程执行完后会自动退出,僵尸进程会被回收;

3、这个可能会一直挂着,如果阻塞的io永远没有到达;

总之,遇到少量的僵尸进程,可以不需要特意的去处理,只需要查看下根源,看看是否有潜在的bug就可以;

(记得有种攻击方法就是创建很多僵尸进程,把进程列表占满,导致系统不能再创建进程)

若有错误,欢迎指正;

作者:庾志辉
来源:CSDN
原文:《父进程为1号进程(ppid=1)的僵尸进程处理和分析》

父进程为1号进程(ppid=1)的僵尸进程处理和分析相关推荐

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

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

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

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

  3. fork()产生的子进程ppid有时不是父进程pid-Linux中的僵尸进程处理

    文章首发及后续更新:https://mwhls.top/929.html 新的更新内容请到mwhls.top查看. 无图/无目录/格式错误/更多相关请到上方的文章首发页面查看. 写完之后,我想到了更严 ...

  4. linux一号进程和二号进程,Linux系统管理10——进程和计划任务管理(示例代码)

    Linux系统管理10--进程和计划任务管理 一.程序和进程的关系 1.程序 ·保存在硬盘.光盘等介质中的可执行代码和数据 ·静态保存的代码 2.进程 ·在CPU及内存中运行的程序代码 ·动态执行的代 ...

  5. linux shell中清理僵尸进程

    2019独角兽企业重金招聘Python工程师标准>>> 今天登录到服务器上时,系统打印有6 zombie processes存在,于是用kill -9去清理掉这些僵尸进程,命令执行完 ...

  6. 僵尸进程的产生与处理

    什么是僵尸进程 僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程. 僵尸进程是怎么样产生 ...

  7. 函数wait、waitpid、孤儿进程、僵尸进程

    一.函数wait.waitpid 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着 ...

  8. python僵尸进程和孤儿进程_Python Web学习笔记之并发编程的孤儿进程与僵尸进程...

    1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...

  9. Linux 僵尸进程

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

最新文章

  1. Cygwin鸡毛蒜皮
  2. 新视角带你认识Python可视化库(附代码资源)
  3. 在编写flash游戏播放声音时的一个要注意的地方
  4. 上海肯特选用Ultimus 提升企业管理
  5. 宾浪超.何飞玲.相爱(帮别人名字隔字作诗)
  6. NSIS安装制作程序
  7. [javascript]JS获取当前时间戳的方法
  8. linux下 安装tengine
  9. linux mysql 挂马_linux服务器被挂马
  10. WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure
  11. 5.9 亿国内用户简历遭殃,数据库持续“裸奔”!
  12. Ubuntu18.04安装MeshLab
  13. 2023年天津理工大学中环信息学院专升本机械设计考试大纲
  14. 谷歌浏览器如何自动运行flash
  15. html5 input的type属性启动数字输入法
  16. QT pro中加入文件拷贝方法
  17. ye lynn yama Loafer 已发送,请注意查收
  18. 【散文】 如果今生我是你梦中的蝴蝶
  19. ios html录制视频,iPhone怎么录屏?玩转iOS14自带屏幕录制功能全攻略
  20. 从NFA到DFA的转换

热门文章

  1. CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+Toolbar组合悬浮置顶的效果
  2. List 删除指定元素
  3. redis配置远程连接
  4. 去重(名字一样,找到年龄最大的)
  5. 智云通CRM:客户的成交过程就像“拍拖”到“结婚”?
  6. 马尔科夫链--维基百科
  7. Java手机忘了密码怎么办_忘记Linux密码怎么办
  8. Android加载Gif动画android-gif-drawable的使用
  9. WPF教程一:基础(转)
  10. 华为鸿蒙系统支持40w快充吗,华为发力,90Hz屏+7000mAh+鸿蒙OS,还支持40W快充!