如何查找和杀掉Linux中的僵尸进程?

如何查找和杀掉Linux中的僵尸进程?,第1张

Linux 系统中,进程就是一个程序的运行实例。它可能运行在前端(比如有交互的进程),也可能运行在后端(比如无交互或自动运行的进程)。它可能是一个父进程(运行期间创建了其他进程),也可能是一个子进程(由其他进程所创建)。

在 Linux 系统中,除 PID 为 0 的第一个 init 进程(或 systemd )外,其余进程都有父进程。进程也可以拥有自己的子进程。

你可以通过使用 pstree 命令 来查看进程的树型结构,你可以清晰的看到各个进程的“家族树”。

在 Linux 系统中,正常情况下,子进程死亡后其父进程会接收到通知进行一些例如释放内存之类的清理 *** 作。但是,如果父进程未收到通知察觉子进程死亡,那么子进程就进入了“僵死”状态

这就是僵死进程产生的原因。

僵尸进程并不可怕,少量的僵尸进程对系统影响并不大。但如果系统的内存已经所剩不多或者有太多的僵尸进程在耗掉内存,问题会变得糟糕。

同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,那么你的系统会发生崩溃。

特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候,这种情况经常发生。在这种情况下,我们就需要找到并杀死僵尸进程。

在linux系统中,进程有如下几种状态,它们随时可能处于以上状态中的一种:

我们可以在命令终端中通过 top命令 来查看系统进程和它的当前状态。

命令如下:

如上面截图中看到的,其中共有 250 个任务(进程),其中 1 个处在 “运行中running” 状态,248 个进程处于 “休眠sleep” 状态,还有一个处于 “僵尸zombie” 状态。

现在问题进入下一步,如何杀死 “僵尸” 进程?

僵尸进程对系统来说就是已经死亡的进程,那么如何杀掉一个已经死亡的进程呢?

方法很简单,我们只需要通过如下ps命令就可以列举僵尸进程,得到它们的进程 ID。

ps ux 命令输出的第 8 列显示了进程状态。上述命令将会打印所有处在 Z+ 状态(表示僵尸状态)的进程。

确认了进程 ID 后,我们可以得到它的父进程 ID:

你也可以将上述两个命令结合在一起,直接得到僵尸进程的 PID 及其父进程的 PID:

通过以上命令都可以找到僵尸进程,然后你就可以通过 kill命 令杀掉了。

或者通过如下命令查看僵尸进程:

该命令输出结果上你可以直接看出其父进程ID,这时候你直接使用kill命令杀掉即可。

再次运行 ps 命令或 top 命令,你可以验证僵尸进程是否已经被杀死。

通过本文你将认识 Linux 系统中的僵尸进程以及明白了其产生的主要原因。同时,你也能学会如何查找僵尸僵尸进程并杀掉僵尸进程。

当然你也可以自己别写脚本设置成定时运行任务自动来替你做这些工作。

Linux中进程分类

①交互进程:由一个shell启动的进程,交互进程既可以在前台运行,也可以在后台运行。

②批处理进程:这种进程和终端没有联系,是一个进程序列。

③监控进程:也称守护进程,是一个在后台运行且不受任何终端控制的特殊进程,用于执行特定的系统任务。

进程的状态

①可运行状态:此时进程正在运行或者正在运行队列中等待准备运行。

②等待状态:此时进程在等待一个事件的发生或某种系统资源。在Linux系统中等待状态又细分为两种等待状态:可中断的等待状态和不可中断的等待状态。

③暂停状态:处于暂停状态的进程被暂停运行。

④僵死状态:每个进程在运行结束后都会处于僵死状态,等待父进程调用进而释放系统资源,处于该状态的进程已经运行结束,但是它的父进程还没有释放其系统资源。

僵尸进程的产生是因为父进程没有 wait() 子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait() 来避免僵尸进程的产生。

当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7332688.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存