解决Python下使用popen函数引起的僵尸进程defunct

发现

登录服务器,突然提示存在几十个僵尸进程,我十分纳闷,是什么原因造成的呢?

遂执行命令:

ps -aux | grep defunct

发现很多进行ID,看来确实存在僵尸进程。那就需要查到究竟是谁引起这么多僵尸进程的。就必须找到产生僵尸进程的父亲是谁?

执行命令:

ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'

命令注解:

-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数

发现了好多将死进程,发现都是5998这个父级进程引起的,那么这个进程是谁呢?

执行命令:

ps aux | grep 5998

发现是一个Python进程引起的。

使用ps axf查看,确定为该进程引起的。

先不说,杀死再查问题的原因。

ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

解决

仔细看了一下代码,觉得代码没什么的。就是使用subprocess.Popen执行了一条命令,为什么就会产生这么多僵尸进程?

查看相关资料后发现,在使用popen函数后,需要调用wait函数(等待子进程中断或结束),否则就会产生僵尸进程。再次查了一下,僵尸进程都不见了。

wait() 函数的功能:

wait() 会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait() 时子进程已经结束,则 wait() 会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。