导航:首页 > 编程系统 > linuxksh怎么查找僵尸进程

linuxksh怎么查找僵尸进程

发布时间:2023-05-16 06:19:54

⑴ 如何查找和杀掉linux中的僵尸进程

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 系统中的僵尸进程以及明白了其产生的主要原因。同时,你也能学会如何查找僵尸僵尸进程并杀掉僵尸进程。

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

⑵ 如何察看僵尸进程 zombie

因为没有指出是什么系统,我这里回答一下Linux下如何通过ps命令来查看僵尸进程:

ps的帮助文档中有指出,僵尸进程会被标记为defunct。

Processesmarked<defunct>aredeadprocesses(so-called"zombies")thatremain
.
(8)iftheparentprocessexits.

所以通过下面命令可以查找出僵尸进程:

psaux|grepdefunct

⑶ 如何找到并终止 Linux 系统中的僵尸进程

在了解僵尸进程之前,让我们来复习一下什么是 Linux 进程。

简而言之, 进程 [1] 是一个程序的运行实例。它可能运行在前端(比如有交互的进程),也可能运行在后端(比如无交互或自动运行的进程)。它可能是一个父进程(运行期间创建了其他进程),也可能是一个子进程(由其他进程所创建)。

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

不相信?可以试试在终端中使用 pstree 命令查看进程的树型结构,你能看到系统各个进程的“家族树”。

子进程死亡后,它的父进程会接收到通知去执行一些清理操作,如释放内存之类。然而,若父进程并未察觉到子进程死亡,子进程就会进入到“<ruby style="box-sizing: border-box;">僵尸<rt style="box-sizing: border-box;">zombie</rt></ruby>”状态。从父进程角度看,子进程仍然存在,即使子进程实际上已经死亡。这就是“<ruby style="box-sizing: border-box;">僵尸进程<rt style="box-sizing: border-box;">zombie process</rt></ruby>”(也被称为“<ruby style="box-sizing: border-box;">已消失进程<rt style="box-sizing: border-box;">defunct process</rt></ruby>”)是如何产生并存在于系统中的。

这里有一个来自 Turnoff.us [2] 的关于僵尸进程的非常有趣的看法:

Image credit: Turnoff.us

重点要说的是,僵尸进程并没有像它的名称那样看起来可怕。

但如果系统的内存已经所剩不多或者有太多的僵尸进程在吃掉内存,问题会变得糟糕。同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,你的系统会发生崩溃。

这是真实可能发生的,它有一定的概率,特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候。

在这种情况下,找到并杀死僵尸进程是一个明智的做法。

Linux 系统中的进程可能处于如下状态中的一种:

那如何查看进程和它的当前状态呢?一个简单的方法是在终端中使用 top 命令 [3]。

Top command show processes and their status

正如你在上面截图中看到的,截图中共有 250 个任务(进程),其中 1 个处在 “<ruby style="box-sizing: border-box;">运行中<rt style="box-sizing: border-box;">running</rt></ruby>” 状态,248 个进程处于 “<ruby style="box-sizing: border-box;">休眠<rt style="box-sizing: border-box;">sleep</rt></ruby>” 状态,还有一个处于 “<ruby style="box-sizing: border-box;">僵尸<rt style="box-sizing: border-box;">zombie</rt></ruby>” 状态。

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

僵尸进程已经死了,要如何才能杀死一个已经死亡的进程呢?

在僵尸电影中,你可以射击僵尸的头部或烧掉它们,但在这里是行不通的。你可以一把火烧了系统来杀死僵尸进程,但这并不是一个可行的方案。

一些人建议发送 SIGCHLD 给父进程,但这个信号很可能会被忽略。还有一个方法是杀死父进程来杀死僵尸进程,这听起来很野蛮,但它却是唯一能确保杀死僵尸进程的方法。

首先,通过在终端中 使用 ps 命令 [4] 我们列举僵尸进程,得到它们的进程 ID:

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

</pre>

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

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

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

</pre>

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

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

</pre>

现在你得到了父进程 ID,使用命令行和得到的 ID 号 终于可以杀死进程了 [5]:

<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">

</pre>

Killing parent process

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

恭喜!现在你知道怎么清理僵尸进程了。

via: https://itsfoss.com/kill-zombie-process-linux/

⑷ ubuntu Linux怎么解决僵尸进程

inux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。
为了遵循这些设计原则,不允许 Linux 内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait() 类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。
如果一个进程已经终止,但是它的父进程尚未调用 wait() 或 waitpid() 对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了

⑸ ubuntu Linux怎么解决僵尸进程

“首先打开Ubuntu桌面 然后准备一个僵尸程序a,接着鼠标右键单击open in terminal,打开终端 输入./a &,运行僵尸程序 输入ps au,查找僵尸程序。凡是STAT是Z的就是僵尸程序,通过Ubuntu Dash,敲入system 单击system monitor(系统监视器) 找到在终端带Z的进程的pid,选中它,右键单击kill,直接将其kill就行了”

⑹ ubuntu Linux怎么解决僵尸进程

如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程?

#ps -ef | grep defunct

或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。

另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。

Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie

top命令中也统计了僵尸进程。或者使用下面的命令:

ps -ef | grep defunct | grep -v grep | wc -l

如何杀死僵尸进程呢?
一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9



kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`

当然您可以自己编写更好的shell脚本,

⑺ Linux里面什么是僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放手郑行子进程占用的资源,此时子进程都将成为一个僵尸进程。如果父进程先退出,子进程被init接管,子丛孙进程退出后init会收回其占用的相关资源。

我们都知道进程的工作原毕哗理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。进程停止后,该进程就会从进程表中移除。

你可以通过System-Monitor查看当前进程。

In UNIX System terminology, a process that has terminated,but whose parent
has not yet waited for it, is called a
zombie.在Unix系统中,一个进程结束了,但是它的父进程没有等待它,那么它将变成一个僵尸进程。但是如果该进程的父进程已经先结束了,那么该进程就不会变僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管他,成为他的父进程。

怎么查看僵尸进程?

利用命令ps,可以看到有父进程ID为1的进程是孤儿进程;s状态为z的是僵尸进程。

注意:孤儿进程是尚未终止但已停止的进程,但其父进程已经终止,由init收养;而僵尸进程则是已终止的进程,其父进程不一定终止。

⑻ 在Linux系统中查看进程及杀死僵尸进程的方法

ps
命令
ps
命令就是最根本相应情况下也是相当强大地进程查看命令.运用该命令可以确定有哪些进程正在运行和运行地状态、
进程
是否结束、进程有没有僵死、哪些进程占用了过多地资源等等.总之大部分信息均为可以通过执行该命令得到地.
ps
命令及其参数
ps
命令最经常使用地还是用于监控后台进程地工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设
备进行通信地,所以如果需要检测其情况,便可以运用
ps
命令了.
该命令语法格式如下:
ps
[选项]
-e
显示所有进程,环境变量
-f
全格式
-h
不显示标题
-l
长格式
-w
宽输出
a
显示终端上地所有进程,包括其他用户地进程
r
只显示正在运行地进程
x
显示没有控制终端地进程
O[+|-]
k1
[,[+|-]
k2
[,…]]
根据
SHORT
KEYS、k1、k2
中快捷键指定地多级排序顺序显示进程列表.
对于
ps
地不同格式都存在着默认地顺序指定.这些默认顺序可以被用户地指定所覆盖.在这里面“+”字符是可选地,“-”
字符是倒转指定键地方向.
pids
只列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入
空格.比如:ps
-f1,4,5.
以下介绍长命令行选项,这些选项都运用“--”开头:
--sort
X[+|-]
key
[,[+|-]
key
[,…]]

SORT
KEYS
段中选一个多字母键.“+”字符是可选地,因为默认地方向就是按
数字升序或者词典顺序.比如:
ps
-jax
-sort=uid,-ppid,+pid.
--help
显示帮助信息.
--version
显示该命令地版本信息.
在前面地选项说明中提到了排序键,接下来对排序键作进一步说明.需要注意地是排序中运用地值是
ps
运用地内部值,并非
仅用于某些输出格式地伪值.排序键列表见表
4-3.
排序键列表
c
cmd
可执行地简单名称
C
cmdline
完整命令行
f
flags
长模式标志
g
pgrp
进程地组
ID
G
tpgid
控制
tty
进程组
ID
j
cutime
累计用户时间
J
cstime
累计系统时间
k
utime
用户时间
K
stime
系统时间
m
min_flt
次要页错
查找Zombie进程
首先,当桌面程序卡死的时候,你可以尝试进入其他tty终端。切换方式:ctrl
+
alt
+
[1,2,3,4,5,6,7],7是桌面终端
其次,你可以使用top命令查看当前是否有Zombie进程
从上图可以看到僵尸进程数,num
zombie,num大于0,则代表系统存在僵尸进程
最后,利用ps命令查找Zombie进程
复制代码
代码如下:
ps
-A
-ostat,ppid,pid,cmd
|
grep
-e
'^[zZ]'
示例

杀死Zombie进程
直接kill
-9
Zombiepid是没有作用的,原因是:Zombie表示进程已经退出,想要清理这样的进程,需要清除其父进程或者等很长时间后内核将其清除
复制代码
代码如下:
kill
-HUP
ppid
后记
不知道为什么我注销之后重新登录还有这个僵尸进程,怀疑是否是LightDM的bug,不过Ubuntu12.04
desktop
display
manager就是LightDM,所以kill
-HUP至少起到了注销的作用,不用重启了

⑼ 【zombie】如何查看并杀死僵尸进程

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it is called a zombie.

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid), 那么它将变成一个僵尸进程.  在fork()/execve()过程中,假设子进程结束时父进程仍存在,蔽皮而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。

我们可以用top命令来查看服务器当前是否有僵尸进程,在下图中可以看到僵尸进程数的提示,如果数字大于0,那么意味着服务器当前存在有僵尸进程:

#ps -ef | grep defunct

#ps -ef | grep defunct | grep -v grep | wc -l

# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'

一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,而此时,尽管对它的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。

我们用ps和grep命令寻找僵尸进程:

# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

命令注解:

-A 参数列出所有进程

-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数

因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程

运行结果参考如下

Z 12334 12339 /path/cmd

这时,我们可以使用 kill -HUP 12339来杀掉轮雹这个僵尸进程

运行后,可以再次腊并帆运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死。

如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行kill -HUP 12334

一条简单的命令,直接查找僵死进程,然后将父进程杀死

#  ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

# ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9

# kill -HUP  $(ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’)

处理SIGCHLD信号并不是必须的,但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。

如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。

在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

或者用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程!

⑽ 如何查看并杀死僵尸进程

僵尸进程也就是Zombie进程,在Ubuntu系统中,要如何查找和杀死僵尸进程呢?随我一起局此来了解下吧。查找Zombie进程首先,当桌面程序卡死的时候,你可以尝试进入其他tty终端。切换方式:ctrl + alt + [1,2,3,4,5,6,7],7是桌面终端其次,你可以使用top命令查看当前是否有Zombie进程从上图可以看到僵尸进程数,num zombie,num大于0,则代表系统存在僵尸进程最后,利用ps命令查找Zombie进圆腊袭程ps -A -ostat,ppid,pid,cmd | grep -e ‘^[zZ]’示例 :具体参数解释可以通过man来自己学习杀死Zombie进程直接kill -9 Zombiepid是没有作用的,原因是:Zombie表示进程已经退出,想要清理这样的进程,需要清除其父进程或者等很长时间后内核将其清除kill -HUP ppid上面就是Ubuntu查杀僵尸进橘兄程的方法介绍了,通过本文介绍的方法就能将僵尸进程去除,及时没有彻底清除,也不影响系统的运行。

阅读全文

与linuxksh怎么查找僵尸进程相关的资料

热点内容
小论文发表了但是数据错误怎么办 浏览:952
注册表禁止启动程序运行 浏览:705
网络优化总体流程图 浏览:735
前端程序员简历模板 浏览:706
蜂巢积木编程机器人怎么样 浏览:561
微信小程序tips 浏览:117
油印文件有哪些 浏览:854
java线程买票案例 浏览:672
java架构培训 浏览:857
price是什么文件 浏览:258
手机游戏编程哪个好学 浏览:259
qq邮箱怎么发语音文件 浏览:494
php删除数据库记录 浏览:905
文件校验工具有哪些 浏览:158
苹果app被乱扣费怎么投诉 浏览:269
数据通信工程师要负责多少设备 浏览:904
excel有没有多个文件数据链接 浏览:842
郑州儿童编程课程应该怎么选择 浏览:103
word2003二级标题编号 浏览:370
ipad百度云盘压缩文件 浏览:912

友情链接