服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|

服务器之家 - 服务器系统 - Linux - Linux系统僵尸进程详解

Linux系统僵尸进程详解

2021-11-10 22:46良许Linux Linux

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

大安好,我是良许。

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

Linux中的进程是什么?

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

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

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

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

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

  1. $ps-ax
  2. PIDTTYSTATTIMECOMMAND
  3. 1?Ss0:01/usr/lib/systemd/systemdrhgb--switched-root--sys
  4. 2?S0:00[kthreadd]
  5. 3?I<0:00[rcu_gp]
  6. 4?I<0:00[rcu_par_gp]

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

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

  1. $pstree-psn
  2. systemd(1)─┬─systemd-journal(952)
  3. ├─systemd-udevd(963)
  4. ├─systemd-oomd(1137)
  5. ├─systemd-resolve(1138)
  6. ├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
  7. │├─systemd-userwor(12714)
  8. │└─systemd-userwor(12715)
  9. ├─auditd(1140)───{auditd}(1141)
  10. ├─dbus-broker-lau(1164)───dbus-broker(1165)
  11. ├─avahi-daemon(1166)───avahi-daemon(1196)
  12. ├─bluetoothd(1167)

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

什么是僵尸进程?

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

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

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

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

Linux系统僵尸进程详解

僵尸进程是怎么产生的?

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

  1. #include
  2. #include
  3. #include
  4. #include
  5. intmain(void)
  6. {
  7. pid_tpid;
  8. pid=fork();
  9. if(pid==0){
  10. printf("Iamchild,myparent=%d,goingtosleep3s\n",getppid());
  11. sleep(3);
  12. printf("-------------childdie--------------\n");
  13. }elseif(pid>0){
  14. printf("Iamparent,pid=%d,myson=%d,goingtosleep5s\n",getpid(),pid);
  15. sleep(5);
  16. system("ps-opid,ppid,state,tty,command");
  17. }else{
  18. perror("fork");
  19. return1;
  20. }
  21. return0;
  22. }

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

Linux系统僵尸进程详解

如何杀死僵尸进程

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

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

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

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

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

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

  1. $sudokill-94809#4809istheparent,notthezombie

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

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

原文链接:https://mp.weixin.qq.com/s/HiBx9kcpPI60n7LHIw5TYQ

延伸 · 阅读

精彩推荐
  • Linux如何在 Linux 终端中删除文件和文件夹

    如何在 Linux 终端中删除文件和文件夹

    本教程讲述了如何在 Linux 终端中安全地删除文件和文件夹。有需要的朋友可以参考下...

    Linux中国11022021-08-16
  • Linux实时监控Linux服务器性能的工具

    实时监控Linux服务器性能的工具

    dstat 是一款生成Linux系统资源统计信息的功能强大、灵活和通用的工具,可以替代vmstat,iostat,netstat和ifstat这些命令的多功能产品。...

    Linux公社4992020-10-27
  • Linux如何在Linux操作系统定时重启Tomcat服务?

    如何在Linux操作系统定时重启Tomcat服务?

    这篇文章主要为大家介绍了如何在Linux操作系统定时重启Tomcat服务,有图有代码,不会的朋友也可以直接复制代码来学习哦,需要的朋友可以参考下 ...

    Linux教程网7342019-10-26
  • LinuxLinux下查看进程和线程的方法

    Linux下查看进程和线程的方法

    这篇文章主要介绍了Linux下查看进程和线程的方法,需要的朋友可以参考下 ...

    Linux教程网12172019-10-18
  • Linuxlinux系统安装出错提示this kernel requires an x86怎么办?

    linux系统安装出错提示this kernel requires an x86怎么办?

    linux系统安装出错提示this kernel requires an x86怎么办?电脑在安装DEBAIN 8的时候,发现安装失败提示遗传英文:”This kernel requires an x86-64 cpu,but only detected a...

    Linux教程网5212019-12-15
  • Linuxlinux cgroups详细介绍

    linux cgroups详细介绍

    这篇文章主要介绍了linux cgroups详细介绍,Cgroups是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(...

    linux技术网2652019-11-07
  • LinuxLinux文件系统究竟是怎么工作的?

    Linux文件系统究竟是怎么工作的?

    文件系统,是对存储设备上的文件,进行组织管理的一种机制。为了支持各类不同的文件系统,Linux 在各种文件系统实现上,抽象了一层虚拟文件系统(VF...

    程序员GitHub5362021-08-24
  • Linuxlinux下批量替换文件内容的方法

    linux下批量替换文件内容的方法

    这篇文章主要介绍了linux系统中批量替换文件内容的方法,不像windows有专门的软件,linux命令行操作 ...

    linux教程网10572019-11-28