Linux运维实战:Linux清理僵尸进程

一、僵尸进程简介:

官方解释:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

一般在系统中僵尸进程的关键字为defunct或者dead,僵尸进程一般指进程已经死了或者已经停止运行了,但是它仍存在与进程列表中。理想状态下,进程在执行完毕后应该直接释放资源,从进程表中退出,但是由于某些原因,父进程没有读取到子进程的完成状态,父进程就不会回收子进程占用的资源,导致子进程一直存在于进程列表中。

二、如何辨别僵尸进程呢?

通过如下命令:
ps aux | egrep “Z|defunct”

Z标识符在STAT列中,defunct标识符在输出的最后一列中,通过这两个标识符可以确认系统中的僵尸进程。

现在我们还不能直接kill僵尸进程,我们最好唤起父进程,让父进程重新尝试读取僵尸进程的状态,最终由父进程清理僵尸进程,这是最好的处理方法,我们现在需要获取父进程的ID,如下:

ps -o ppid=

三、 如何清理僵尸进程呢?

我们获取了父进程的ID号,我们可以通过如下命令向父进程发送一个信号:

kill -s SIGCHLD

有些时候该命令可能不起作用,那么我们可以直接Kill父进程。

kill -9

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
",getpid());
                while(1)
                {
                        printf("son---i=%d
",i);
                        i++;
                        sleep(1);
                        if(i==5)
                        break;
                }
                printf("son is over!
");
        }else if(pid>0)
        {
                printf("parent pid is %d
",getpid());
                while(1) sleep(100);
        }
        return 0;

}

在系统中创建js.c文件,将代码贴进去。

然后:

gcc -o jsjs.c \编译

./js \执行

查看自己创造的僵尸进程:

后续就可以尝试清理僵尸进程啦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值