Linux系统僵尸进程详解

news/2024/7/10 19:57:52 标签: linux, 后端, 互联网, 服务器

大安好,我是良许。

本文我们将来讨论一下什么是僵尸进程,僵尸进程是怎么产生的,如何杀死一个僵尸进程。

Linux中的进程是什么?

讲到进程,我们要先了解一下另一个概念:程序

程序说白了就是躺在电脑硬盘上的一个文件而已(如同硬盘女神一样),在被 CPU 执行之前,它啥也做不了。

当程序被执行之后,它运行的实例就称为进程 。一个程序可以对应多个进程。

进程是系统的工作单元。系统由多个进程组成,其中有的是操作系统进程(执行系统代码),其他的是用户进程(执行用户代码)。所有这些进程都会并发执行,例如通过在单 CPU 上采用多路复用来实现。

你可以使用 ps 命令查看 Linux 系统中的所有进程 。

$ ps -ax
        PID TTY         STAT   TIME COMMAND
        1 ?     Ss      0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys
        2 ?     S       0:00 [kthreadd]
        3 ?     I<      0:00 [rcu_gp]
        4 ?     I<      0:00 [rcu_par_gp]

当一个进程调用 fork 函数生成另一个进程,原进程就称为父进程,新生成的进程则称为子进程。

Linux 系统中这样父子进程非常多,我们可以使用 pstree 命令查看系统上的进程「谱系」。

$ pstree -psn
systemd(1)─┬─systemd-journal(952)
        ├─systemd-udevd(963)
        ├─systemd-oomd(1137)
        ├─systemd-resolve(1138)
        ├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
        │                     ├─systemd-userwor(12714)
        │                     └─systemd-userwor(12715)
        ├─auditd(1140)───{auditd}(1141)
        ├─dbus-broker-lau(1164)───dbus-broker(1165)
        ├─avahi-daemon(1166)───avahi-daemon(1196)
        ├─bluetoothd(1167)

每个进程在系统中都被分配了一个编号。在这所有的进程中,有个非常特殊的进程,它的 ID 号是 1 。它是系统在引导过程中执行的第一个进程,PID 1 之后的每个后续进程都是它的后代。

什么是僵尸进程?

前面提到过,在 Linux 环境中,我们是通过 fork 函数来创建子进程的。创建完毕之后,父子进程独立运行,父进程无法预知子进程什么时候结束。

通常情况下,子进程退出后,父进程会使用 waitwaitpid 函数进行回收子进程的资源,并获得子进程的终止状态。

但是,如果父进程先于子进程结束,则子进程成为孤儿进程。孤儿进程将被 init 进程(进程号为1)领养,并由 init 进程对孤儿进程完成状态收集工作。

而如果子进程先于父进程退出,同时父进程太忙了,无瑕回收子进程的资源,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程,如下图所示:

僵尸进程是怎么产生的?

前面已经介绍了僵尸进程产生的原理,下面我们通过代码来模拟僵尸进程的产生。

#include  
#include  
#include  
#include  

int main(void)  
{  
    pid_t pid;  
    pid = fork();  
    if (pid == 0) {  
            printf("I am child, my parent= %d, going to sleep 3s\n", getppid());  
            sleep(3);  
            printf("-------------child die--------------\n");  
    } else if (pid > 0) {  
            printf("I am parent, pid = %d, myson = %d, going to sleep 5s\n", getpid(), pid);  
            sleep(5);  
            system("ps -o pid,ppid,state,tty,command");  
    } else {  
        perror("fork");  
        return 1;  
    }  

    return 0;  
}  

在这个程序里,父进程创建子进程之后,就休眠 5 秒钟。而子进程只休眠 3 秒钟就退出,在它退出之后,父进程还未苏醒,因此没人给子进程「收尸」,所以它就变成了僵尸进程。

如何杀死僵尸进程

对于普通进程,我们可以通过使用 kill 命令来杀死它们。kill 命令它还有几个兄弟,比如 pkillkillall ,虽然它们名称里都带 kill 这样杀气腾腾的字眼,但它们实际上是被设计为向一个或多个进程发送信号。

在未指定的情况下,这几个命令默认发送的是 SIGTERM 信号。

普通进程可以被 kill ,但僵尸进程是不行的。为什么?因为僵尸进程本身就已经「死」过一次了!如果还可以再「死」,那「僵尸」这个名号就没多大意义了。

僵尸进程其实已经就是退出的进程,因此无法再利用kill命令杀死僵尸进程。僵尸进程的罪魁祸首是父进程没有回收它的资源,那我们可以想办法它其它进程去回收僵尸进程的资源,这个进程就是 init 进程。

因此,我们可以直接杀死父进程,init 进程就会很善良地把那些僵尸进程领养过来,并合理的回收它们的资源,那些僵尸进程就得到了妥善的处理了。

例如,如果 PID 5878 是一个僵尸进程,它的父进程是 PID 4809,那么要杀死僵尸进程 (5878),您可以结束父进程 (4809):

$ sudo kill -9 4809  #4809 is the parent, not the zombie

杀死父进程时要非常小心,如果一个进程的父进程就是 PID 1 ,并且你还杀死了它,那么系统将直接重启!

这将是一个更可怕的故事!


最后,最近很多小伙伴找我要Linux学习路线图,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!

免费送给大家,只求大家金指给我点个赞!

电子书 | Linux开发学习路线图

也希望有小伙伴能加入我,把这份电子书做得更完美!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 书单 | 程序员必读经典书单(高清PDF版)

http://www.niftyadmin.cn/n/1259476.html

相关文章

不自由的自由职业

大家好&#xff0c;我是良许&#xff0c;前码农&#xff0c;现在自由职业者。 有关注我朋友圈的小伙伴都知道&#xff0c;就在上周&#xff0c;我刚刚结束了长达 35 天的「假期」。 此言一出&#xff0c;立刻掀起了评论区留言狂潮&#xff0c;大家纷纷问我&#xff0c;你特么不…

php socket 模型及效率问题

// 创建套接字 socket_create(); // 绑定 socket_bind(); // 监听 socket_listen();// 主体&#xff0c; 死循环 while(true){// select模型&#xff0c; 取出可读套接字列表socket_select();foreach(sockets) {// 如果是监听连接请求端口的套接字if(is listensocket) {// 接受…

Linux系统查看磁盘可用空间的5个命令

大家好&#xff0c;我是良许。 工作中&#xff0c;经常会遇到磁盘爆满的情况&#xff0c;尤其是一台服务器运行了 N 年之后&#xff0c;里面会充满各种各样垃圾文件&#xff0c;比如&#xff1a;编译产生的中间文件、打包的镜像文件、日志文件&#xff0c;等等。 别问我怎么知…

asp.net ajax 怎么获取前端ul li_京东 前端 面经总结分析第一期

我们的公众号&#xff1a;扶摇就业1.js函数里面不用var声明变量外部可以访问到吗&#xff0c;如果不用var&#xff0c;怎么实现不让外部访问到内部属性函数中声明变量不用Var时这个变量会成为全局变量&#xff0c;但是并不是函数一开始执行就会把它变为全局变量&#xff0c;必须…

一本神奇的电子书

大家好&#xff0c;我是良许。 印象中&#xff0c;我们接触到的编程书籍都是这样的&#xff1a; 这样的书籍&#xff0c;去除阅读属性之后&#xff0c;还可以用来垫电脑屏幕、垫桌脚、盖泡面、砸产品经理&#xff0c;实乃居家、旅行、自卫必备神器&#xff01; 这种书籍一般内…

小程序在wxml里转数字_我从1000个小程序里,挑选10款好用小程序,丰富你的微信...

我从1000个小程序里&#xff0c;挑选10款好用小程序&#xff0c;丰富你的微信由于笔者的工作缘故&#xff0c;一天工作的一半时间都要和小程序和APP打交道。这些年用的少说没一千也有八九百。于是笔者在里面挑了10款好用的小程序给大家分享。PS&#xff1a;看完如果大家觉得好用…

网贷大数据什么时候会好_压力大的时候为什么会拉肚子

本文由公众号 “把科学带回家” 提供在压力山大的时候&#xff0c;恶心想吐、拉稀放屁是很正常的行为。吓尿了、吓屎了&#xff0c;说的不仅仅是人类。这是因为包括人类在内&#xff0c;动物们在遇到危险和压力的时候都有一个天然的防御模式&#xff1a;战斗或逃跑&#xff08;…

图解固件、驱动、软件的区别

大家好&#xff0c;我是良许。 不管我们使用什么操作系统&#xff0c;无论是 Windows、macOS 还是 Linux &#xff0c;里面都安装了许多软件、驱动程序和固件。但是&#xff0c;这三者概念有区别呢&#xff1f; 我在朋友圈做了个小调查&#xff0c;发现居然很多人不清楚他们的…