在Linux服务器上,使用top命令查看CPU使用情况,发现大量僵尸进程。
解决办法:
1. 通过 ps aux | grep Z
定位到僵尸进程。最后有defunct的标记,就表明是僵尸进程。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2518 0.0 0.0 0 0 ? Z Jan23 0:00 [docker] <defunct>
root 2521 0.0 0.0 0 0 ? Z Jan23 0:00 [docker] <defunct>
root 2533 0.0 0.0 0 0 ? Z 00:19 0:00 [docker] <defunct>
root 2535 0.0 0.0 0 0 ? Z 00:19 0:00 [docker] <defunct>
2. 通过 pstree -apscl <pid>
找到是哪个Java进程创建的。
3. 清理僵尸线程
正常情况下我们可以用 SIGKILL
信号来杀死进程,但是僵尸进程已经死了, 你不能杀死已经死掉的东西。 因此你需要输入的命令应该是
kill -s SIGCHLD pid
将这里的 pid 替换成父进程的进程 id
清理僵尸线程:把父进程杀掉,父进程死后,僵尸进程称为“孤儿进程”,过继给1号进程init,init始终负责清理僵尸进程,它产生的所有僵尸进程跟着消失
程序中处理僵尸进程参考这条