最近在使用jupyter运行多进程程序时,发现重启jupyter notebook偶尔会留下一些僵尸进程,应该是python父进程被终止之后子进程没有被正确释放造成的。僵尸进程依然会占用系统资源,如果不及时清理可能会严重影响系统性能。

先解释下什么是僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。
— 百度百科

在jupyter中使用多进程执行程序时,如果程序还没有执行完成就点击菜单栏的 Kernel -> Restart xxx,就有可能会造成僵尸进程。

如何检查僵尸进程是否存在呢?在命令行中执行如下命令就可以返回僵尸进程状态、父进程ID、进程ID和执行的具体命令:

1
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

杀死僵尸进程也比较容易,执行如下命令就可以清理僵尸进程:

1
kill -9 `ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}'`

我的微信公众号:pyquant