Ubuntu查找和杀死僵尸进程
# zombie #
通常,父进程通过 wait()函数检查其子进程的状态。子进程完成后,等待功能会通知父进程完全从内存中退出该进程。但是,如果父级未能为其任何子级调用wait函数,则子级进程将作为死进程或僵尸进程(失效进程)在系统中保持活动状态。这些僵尸进程可能大量堆积在系统上,并影响其性能。在这种情况下,须杀死这些僵尸进程。
Part 1
查看僵尸进程
可以通过查看系统上运行的各种进程来检查系统性能。Ubuntu可以通过top命令查看这些过程:
top
可以在第二行看到系统上存在16个僵尸进程。
如果想要有关僵尸进程的更多详细信息,请使用以下命令:
ps -A -ostat,ppid,pid,cmd | grep -e '^[zZ]' #或
ps axo stat,ppid,pid,comm | grep -w defunct
此命令将提供 状态,parentID,进程ID,正在运行僵尸进程的程序 (在我的系统上名为“ zombie”的虚拟程序)。失效标志表明这是一个僵死的僵尸进程。
Part 2
杀死Zombie-Process
首先,让我们了解僵尸进程如何威胁到我们系统的性能。重要的是要知道僵尸已经死了,并且大多数已完成的进程不占用内存或CPU资源。但是,每个进程都分配有唯一的进程ID,该ID来自处理器保留的有限PID池。如果大量僵尸聚集在一起,它们将消耗掉PID池的大部分,并且由于缺少进程ID,新进程将无法启动。少量已消失的程序占据系统不是很大的威胁,但这意味着它们的父程序由于错误或缺少 wait()函数而无法将其取消。
当父进程(PPID)无法自动调用 wait()函数时,我们需要手动向父进程发出信号,以在其所有子进程(PID)上运行wait函数,以便可以调用具有完整状态的子进程。可以通过运行SIGCHLD命令来做到这一点。如果不起作用,可以手动杀死父进程,以便杀死其所有僵尸子进程,从而为新进程释放进程ID。
通常的方法是使用以下命令来向僵尸的父进程发出信号,以杀死该命令。
kill -s SIGCHLD PID
在某些情况下,此命令可能无法使用,因为并非所有父进程都已正确编程,以便检查子进程。在这种情况下,可以通过以下命令终止父进程:
kill -9 PPID
# 实例:
ps axo stat,ppid,pid,comm | grep -w defunct | awk '{print "kill -9 " $2}'
通过这种方式杀死了几乎所有僵尸进程,运行top命令后,您将能够看到系统上的进程情况:
参考阅读:
https://ubuntuqa.com/article/7516.html