
如果你经常使用Linux,你应该会遇到术语僵尸进程。那么什么是僵尸过程呢?它们是如何形成的?它们对系统有害吗?我如何杀死这些进程?下面会回答这些问题。
什么是僵尸进程?我们都知道这个过程是如何运作的。我们启动一个程序,开始我们的任务,然后在任务完成时停止进程。当流程停止时,它将从流程表中移除。
您可以通过系统监视器检查当前进程。
然而,有时一些程序甚至在执行后仍保留在进程表中。
然后,这些已完成其生命周期但仍留在流程表中的流程称为僵尸进程。
它们是如何形成的?当你运行一个程序时,它会产生一个父进程和许多子进程。所有这些子进程都会消耗内核分配给它们的内存和CPU资源。
这些子进程执行完毕后,会发出退出信号,然后死亡。这个退出信号需要被父进程读取。父进程需要调用wait命令来读取子进程的退出状态,并将子进程从进程表中删除。
如果父进程正确读取子进程的退出信号,子进程将从进程表中删除。
但是,如果父进程未能读取子进程的退出信号,子进程将不会从进程表中删除,尽管它在执行完成后处于死状态。
僵尸进程对系统有害吗?不。因为僵尸进程不会不做任何事情,不使用任何资源或影响其他进程,它不会拥有僵尸进程并没有坏处。但是,因为进程表中的退出状态和其他进程信息也存储在内存中,所以过多的僵尸进程有时会成为一个问题。
你可以这样想象:
"你是一家建筑公司的老板。你每天根据工人的工作量付给他们工资。每天都有一个工人来到工地,坐在那里。你不我不用付钱,他也不用。我不做任何工作。他只是每天来,坐在那里,这这就是全部!"
这个工人就是僵尸进程的一个活生生的例子。但是,如果你有很多僵尸工人,你的工地就会拥堵,正常工人很难工作。
那么如何找出僵尸进程呢?打开终端并输入以下命令:
psaux|grepZ
列出了进程表中所有僵死进程的详细信息。
如何杀死僵尸进程?
正常情况下,我们可以用SIGKILL信号杀死进程,但是僵尸进程是死的,你可以不要杀死已经死去的东西。因此,您需要输入的命令应该是
kill-sSIGCHLDpid
用父进程的进程id替换这里的pid,这样父进程将删除所有已完成的和死的子进程。
你可以把它想成:
"你在路中间发现了一具尸体,所以你联系了死者的家人,然后他们会把尸体从路上运走。"
然而,许多程序并没有写得那么好,以至于它们不能不要删除这些次僵尸(否则,你不会起初我看不到他们。因此,确保删除子僵尸的唯一方法是杀死它们的父进程。









