Linux下什么是僵尸进程
Linux 系统上运行的所有内容都是一个进程,要么发生在前台(用户可见),要么发生在后台(不明显的进程,如系统服务)。进程可以处于多种状态,包括正在运行、不可中断睡眠、可中断睡眠、停止和僵尸。但什么是僵尸进程呢?
在本教程中,我们将讨论 Linux 上的僵尸进程。我们将讨论它们的定义、目的以及如何在 Linux 系统上识别和删除它们。
在本教程中您将学习:
什么是僵尸进程以及它们为何存在?
如何识别僵尸进程
如何杀死僵尸进程
什么是僵尸进程?
如上所述,Linux 进程可以处于几种不同的状态。我们关心的是僵尸进程。僵尸进程是已完成执行的进程——要么优雅地关闭,要么强制关闭。该进程已死亡(因此得名),但仍然存在于进程表中。它只是还没有被清除,但它已经不再运行了。这是一个尚未完全消失的死进程,有点像……僵尸!
注意
僵尸进程有时也称为失效进程。当进程收到 SIGCHLD 信号时,就会进入僵尸状态。
僵尸进程通过 wait()
或 waitpid()
等待其父进程读取其退出值,然后将其从进程表中清除。如果父进程退出,那么 init
将销毁其剩余的僵尸进程。
识别并杀死僵尸进程
能够轻松识别僵尸进程的好方法并不多。这不是用户通常需要关心的事情,因为系统完全有能力管理僵尸进程。唯一的例外可能是一个有缺陷的程序,它不断地生成子进程并且从不正确地清除它们。
不过,如果您决心寻找僵尸进程,我们可以使用 ps 命令。使用以下选项过滤掉 PID 和状态列。然后,我们将通过管道连接到 awk,以便仅显示状态为“Z”(僵尸)的进程。
$ ps axo pid=,stat= | awk '$2~/^Z/ { print }'
再说一次,通常不需要识别这些进程,更不用说杀死它们了。然而,一个简单的终止命令就可以解决问题。只需提供之前检索到的 PID 作为命令的参数即可。
$ kill 1234
如果它不起作用,您可以通过在命令中使用 -9
选项来发送 SIGKILL
信号:
$ kill -9 1234
结束语
在本教程中,我们了解了 Linux 系统上的僵尸进程是什么。我们还了解了如何识别我们自己系统上的僵尸进程,并手动销毁它们。僵尸状态只是进程可能处于的五种可能状态之一——所有状态都有自己的重要目的。