死亡的日子快到了,这就是为什么我们要从LxA做这个小教程来谈论 僵尸进程 以及我们如何杀死他们。 首先要说的是僵尸进程是什么,这就是众所周知的,Linux内核具有一个子系统来管理进程,并与调度程序一起创建,改变优先级,发送或删除CPU处理流程以及杀死进程好吧,内核的这一部分与其他类似Unix的系统一样,可以区分进程的各种状态...
所以我们可以找到 一个过程 它可以处于睡眠(S)状态,即处于睡眠状态。 此外,处于运行状态(R)的进程(当前正在运行或正在运行的进程),正在等待的进程(D)(已停止等待被照顾,打手势(T)或暂停),以及僵尸(Z)或已故。 僵尸进程或死进程是已经成功终止的进程,但是由于Linux仍将其保存在进程表中,因此某些系统资源被劫持了。 您已经知道,当一个进程结束时,它不应该保持这种状态,而应该完成并且内核释放资源,以便其他进程可以使用它们,基本上,它可以释放占用的RAM ...
好吧,虽然这种僵尸进程并不那么频繁,但它并没有那么有趣,我们可以按照此处指示的方法进行搜索并消除它们。 第一件事是查找我们发行版中是否存在僵尸进程,为此我们可以自助 像top或ps之类的工具。 例如,以下两个选项之一:
ps -el | grep 'Z' ps aux | grep defunct
一旦检测到,我们就可以 杀了他 直接与:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
尽管另一种选择是找到父进程,但是 杀死僵尸进程 您可能已经推论,必须杀死支持它的父进程:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
您将不得不更换根据找到的僵尸进程的ID并用kill杀死它,请使用父进程的ID替换在这个例子中,很明显。
发表评论,留下您的评论
不错的网站!
他们总能让我们摆脱困境。
哪里说:
虽然另一种选择是找到父进程,因为要杀死僵尸进程,您必须杀死支持它的父进程,正如您可能已经推断出的那样:
1 | ps -eo pid, ppid | 格雷普
2|
3 | 杀 -9
您必须替换您找到的僵尸进程的 ID 并用 kill 杀死它,显然使用示例中替换的父进程的 ID。
您可以添加脚本:
$猫killppid.sh
#!/斌/庆典
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
当然,这不是一个普通用户一直在执行的任务。
它只对管理员有用,但以 root 身份运行它是危险的,因为它可以杀死系统上的任何进程。
在 man kill 它有这样的注释:
注意 您的 shell(命令行解释器)可能有一个内置的 kill 命令。 你可以
需要运行这里描述为/bin/kill的命令来解决冲突。
Bash 有那个命令,这是 man bash 关于它的一部分:
杀死 [-s sigspec | -n 符号 | -sigspec] [pid | 工作规范] ...
kill -l | -L [sigspec | 退出状态]
将sigspec或signum命名的信号发送给pid或job命名的进程
规格sigspec 是不区分大小写的信号名称,例如 SIGKILL(带有或
没有 SIG 前缀)或信号编号; signum 是信号编号。 如果
sigspec 不存在,则假定为 SIGTERM。 -l 的参数列出了
信号名称。 如果在给出 -l 时提供了任何参数,则
列出了与参数对应的信号,返回状态为 0。
-l 的 exit_status 参数是一个数字,指定信号编号或
由信号终止的进程的退出状态。 -L 选项等效
借给-l。 如果至少成功发送了一个信号,kill 返回真,或者
如果发生错误或遇到无效选项,则为 false。
一开始他们解释了 bash 如何保护进程,以避免一些问题,但我不清楚如何制作一个安全的脚本来以 root 身份运行。
我唯一能想到的就是像这样保护它:
$猫killppid.sh
#!/斌/庆典
如果 [$ USER == "root"]
然后 echo 不要以 root 身份运行 $ 0 !!! 有危险!
出口
fi
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
使用bash的kill,而不是/bin/kill
你怎么能看出我不太精通 bash。
你知道如何编写一个以子进程用户身份运行的安全脚本,即使它以 root 身份运行?
相当于像这样手动完成的事情:
$苏;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')