在 Ubuntu(以及其它 Linux 系统)中,**僵尸进程(Zombie Process)**是一个常见但容易被误解的概念。下面从“是什么、为什么、怎么看、怎么处理、如何预防”几个方面来说明。
僵尸进程是指:
一个已经结束运行(退出)的进程,但其父进程还没有调用
wait()/waitpid()来回收它的退出状态。
此时进程:
在 ps 中通常显示为:
STAT = Z
例如:
1234 ? Z 0:00 [bash] <defunct>
典型流程:
exit() 退出常见原因:
wait()ps aux | grep ' Z'
或:
ps -eo pid,ppid,stat,cmd | grep '^.* Z'
ps aux | awk '$8=="Z" {print}'
或:
top
在 Tasks 一行会看到:
Tasks: 210 total, 1 zombie
✅ 一般不会直接拖垮系统
❌ 但问题在于:
kill -9 <zombie_pid> # 无效
wait() 逻辑kill -9 <parent_pid>
之后僵尸会被 init / systemd 收养并回收。
signal(SIGCHLD, SIG_IGN);
或:
waitpid(-1, NULL, WNOHANG);
import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
或使用:
subprocess.Popen(..., start_new_session=True)
僵尸进程不是“死不掉的进程”,而是“父进程没善后的进程”。
如果你愿意,可以:
ps 输出