Linux运维实战:Linux清理僵尸进程
一、僵尸进程简介:
官方解释:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
一般在系统中僵尸进程的关键字为defunct或者dead,僵尸进程一般指进程已经死了或者已经停止运行了,但是它仍存在与进程列表中。理想状态下,进程在执行完毕后应该直接释放资源,从进程表中退出,但是由于某些原因,父进程没有读取到子进程的完成状态,父进程就不会回收子进程占用的资源,导致子进程一直存在于进程列表中。
二、如何辨别僵尸进程呢?
通过如下命令:
ps aux | egrep "Z|defunct"
Z标识符在STAT列中,defunct标识符在输出的最后一列中,通过这两个标识符可以确认系统中的僵尸进程。
现在我们还不能直接kill僵尸进程,我们最好唤起父进程,让父进程重新尝试读取僵尸进程的状态,最终由父进程清理僵尸进程,这是最好的处理方法,我们现在需要获取父进程的ID,如下:
ps -o ppid= <Child PID>
三、 如何清理僵尸进程呢?
我们获取了父进程的ID号,我们可以通过如下命令向父进程发送一个信号:
kill -s SIGCHLD <Parernt PID>
有些时候该命令可能不起作用,那么我们可以直接Kill父进程。
kill -9 <Parernt PID>
TIPS:将父进程kill掉,将影响所有归属的子进程,准备kill之前,我们需要双重检查以便制造出更多令人忧虑的麻烦。如果系统存在很少的僵尸进程,同时也没有占用更多的系统资源,最好的方法是在下一次的系统维护计划中kill父进程。
四、如何快速创建测试僵尸进程呢?
小A:如果系统没有僵尸进程怎么办呢?
大B:那....
大B:那就创造僵尸进程吧!
使用C语言的fork函数可以快速打造出一个僵尸进程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <linux/wait.h>
int main(int argc,char **argv)
{
int i=0;
pid_t pid=fork();
if(pid==-1) return 0;
else if(pid==0)
{
printf("son pid is %d\n",getpid());
while(1)
{
printf("son---i=%d\n",i);
i++;
sleep(1);
if(i==5)
break;
}
printf("son is over!\n");
}else if(pid>0)
{
printf("parent pid is %d\n",getpid());
while(1) sleep(100);
}
return 0;
}
在系统中创建js.c文件,将代码贴进去。
然后:
gcc -o js js.c \\编译
./js \\执行
查看自己创造的僵尸进程:
后续就可以尝试清理僵尸进程啦。
更多推荐
所有评论(0)