0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

服务器惊现“活死人”?僵尸进程排查、危害与解决全指南

jf_44130326 来源:Linux1024 2026-02-04 17:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在服务器运维中,你是否遇到过这样的怪事:明明任务已经结束,进程却像活死人一样赖着不走,还霸占着进程IDPID)?这就是僵尸进程(Zombie Process在搞鬼。今天,我们不仅拆解它的排查与解决方法,更要讲清它对系统的隐藏危害,让你彻底拿捏这个顽固分子

一、先搞懂:僵尸进程到底是什么?

简单来说,僵尸进程是一种半成品状态的进程:

子进程已经运行结束(代码执行完、资源释放),但父进程没调用wait()waitpid()回收它的身份信息(比如进程控制块PCB,存储进程PID、状态等核心数据)。

它不占CPU、内存,但会占用系统的PID资源——这是它最危险的地方。

二、警惕!僵尸进程对系统的3大危害

很多人觉得僵尸进程不占资源,不用管,但忽略了它的隐性风险,积累到一定程度会直接瘫痪系统:

1.耗尽PID资源,导致新进程无法创建

Linux系统的PID是有限的(默认一般是32768,可通过/proc/sys/kernel/pid_max查看)。若大量僵尸进程堆积,PID会被占满,此时无论执行lsssh还是启动服务,都会报错“Resource temporarily unavailable”(资源暂时不可用),新进程完全无法创建。

2.增加内核管理负担

每个僵尸进程的PCB(约几十字节)会一直存放在内核空间。虽然单个占用小,但thousands级别的僵尸进程会让内核在遍历进程列表(如pstop命令)时变慢,间接影响系统响应速度。

3.掩盖父进程的异常问题

僵尸进程的本质是父进程没尽责回收。若长期存在僵尸进程,可能意味着父进程本身有bug(如死锁、信号处理逻辑缺失)或已经卡死——此时不处理,父进程可能会进一步引发更严重的问题(如内存泄漏、业务中断)。

三、如何快速揪出僵尸进程?

用两个命令,轻松锁定嫌疑犯

1.ps命令:精准筛选僵尸进程

在终端执行以下命令,直接过滤出状态为Z(僵尸)或包含defunct(已失效)的进程:

wKgZO2kal-eAD-6LAABErXWJcq0930.png
# 方式1:显示完整信息(推荐)ps aux |grep -E 'Z|defunct'# 方式2:只输出关键信息(PID、父进程PPID、进程名)ps -ef | awk '$8~/Z|defunct/&&$0!~/grep/{print"PID:"$2,"PPID:"$3,"COMMAND:"$8}'

示例输出(带STATZ的就是僵尸进程):

USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMANDroot   12340.00.0  0  0pts/0  Z+ 10:00 0:00[test] 

2.top命令:看僵尸进程总数

执行top后,注意顶部状态栏的zombie计数(如zombie: 5表示有5个僵尸进程)。若计数不为0,按f键勾选PPID字段,再按O键按STAT排序,就能快速定位所有Z状态的进程。

四、僵尸进程是怎么诞生的?看反面代码

僵尸进程的根源是父进程偷懒,看这段会产生僵尸进程的错误代码:

#include#include#includeintmain(){ pid_tpid = fork(); // 创建子进程 if(pid ==0) {   // 子进程:执行完立即退出   printf("子进程 (PID: %d) 完成任务,退出n",getpid());   exit(0);  }else{   // 父进程:不回收子进程,休眠10秒   printf("父进程 (PID: %d) 休眠中,子进程会变僵尸n",getpid());   sleep(10); // 这10秒内,子进程是僵尸状态  } return0;}

问题核心:父进程没有调用wait()/waitpid()回收子进程,导致子进程退出后,PCB一直留在内核中。

五、如何送走僵尸进程?2种正确代码+极端方案

解决僵尸进程的核心是让父进程主动回收子进程资源,以下是两种常用正确写法,覆盖不同场景:

方式1:阻塞等待回收(适用于父进程可暂停的场景)

父进程用waitpid()阻塞等待子进程退出,直接回收资源,简单直接:

#include#include#include#includeintmain(){ pid_tpid = fork(); if(pid ==0) {   printf("子进程 (PID: %d) 执行任务...n",getpid());   sleep(2); // 模拟任务耗时   exit(0);  }else{   printf("父进程等待子进程退出...n");   intstatus;   // 阻塞等待指定子进程,回收资源   waitpid(pid, &status,0);   // 可选:解析子进程退出状态(正常/被信号终止)   if(WIFEXITED(status)) {     printf("子进程正常退出,退出码:%dn",WEXITSTATUS(status));    }   printf("子进程已回收,无僵尸n");  } return0;}

方式2:异步处理(适用于父进程需继续干活的场景)

若父进程要同时处理其他任务(如服务端程序),可通过捕获SIGCHLD信号,在子进程退出时自动回收,不阻塞父进程:

#include#include#include#include#include// 信号处理函数:子进程退出时触发voidhandle_sigchld(intsig){ pid_tpid; intstatus; // 非阻塞循环,回收所有已退出的子进程 while((pid =waitpid(-1, &status, WNOHANG)) >0) {   printf("子进程 (PID: %d) 已回收n", pid);  }}intmain(){ // 注册SIGCHLD信号处理函数 structsigactionsa;  sa.sa_handler = handle_sigchld;  sa.sa_flags = SA_RESTART; // 重启被信号中断的系统调用 sigemptyset(&sa.sa_mask); sigaction(SIGCHLD, &sa,NULL); pid_tpid = fork(); if(pid ==0) {   printf("子进程 (PID: %d) 执行任务...n",getpid());   sleep(2);   exit(0);  }else{   printf("父进程继续处理其他任务...n");   sleep(5); // 父进程的其他工作,不被阻塞   printf("父进程工作结束n");  } return0;}

极端方案:杀死父进程(谨慎!)

若父进程本身卡死、无响应(如死锁),无法回收子进程,可尝试杀死父进程(替换<父进程PPID>为实际ID):

# 先优雅终止kill<父进程PPID># 若10秒后未退出,强制终止(会中断父进程业务,需评估影响)kill-9 <父进程PPID>

父进程死后,其所有子进程(包括僵尸)会被系统的init进程(PID=1)接管,init会自动回收僵尸进程。

六、一张思维导图,梳理完整排查流程

为了让你在实际运维中快速上手,整理了「僵尸进程排查验证全流程」思维导图,按步骤操作即可:

wKgZO2kal-eAMPrHAAKc5YmqqBA700.png

七、常见误区避雷

1.直接kill僵尸进程?没用!僵尸进程已经死透kill信号对它无效,必须从父进程入手。

2.少量僵尸不用管?可以,但要警惕!单个僵尸无害,但要排查父进程是否有bug,避免后续堆积。

3.父进程是init就安全?不一定!init会定期回收,但长期存在init接管的僵尸,说明原父进程频繁崩溃,需查原进程稳定性。

总结

僵尸进程的本质是父进程没尽责,危害虽不直接,但积累后会瘫痪系统。记住核心解决逻辑:找父进程让父进程回收预防下次发生

下次遇到僵尸进程,对照思维导图一步步来,轻松解决!觉得有用的话,点赞+分享,让更多运维小伙伴避坑~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11817

    浏览量

    219555
  • 服务器
    +关注

    关注

    14

    文章

    10359

    浏览量

    91758
  • 进程
    +关注

    关注

    0

    文章

    211

    浏览量

    14562
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    服务器远程不上服务器怎么办?服务器无法远程的原因是什么?

    运营商。 2.服务器网络问题 解决办法:通过路由图来确定是哪里的线路出现丢包,联系服务器商切换线路。 二、服务器问题 服务器带宽跑满、服务器
    发表于 02-27 16:21

    孤儿进程僵尸进程

    前段时间,由于研究经典面试题,把孤儿进程僵尸进程也总结了一下。我们有这样一个问题:孤儿进程僵尸进程
    发表于 11-29 14:08

    为什么会出现LINUX僵尸进程

    僵尸进程出现在父进程没有回收子进程的PCB的时候,这个时候子进程已经结束,但是父进程没有回收他,
    发表于 08-07 06:48

    进程有几种状态?

    ?线程间同步方法有哪些?什么是内核线程和用户线程?内核线程和用户线程的区别?内核线程和用户线程有什么优缺点?什么是僵尸进程,孤儿进程,守护进程僵尸
    发表于 12-24 07:16

    AMD重新构思服务器科技,可支持APU服务器软件

    AMD重新构思服务器科技,可支持APU服务器软件,帮助服务器适应现代数据中心工作负载的新一代开发工具亮相APU13开发者峰会。
    发表于 11-15 10:19 855次阅读

    内存转发服务器

    内存转发服务器
    发表于 01-04 13:49 0次下载

    僵尸进程的产生介绍和危害以及解决方法

    如果你经常使用 Linux,你应该遇到这个术语“僵尸进程Zombie Processes”。 那么什么是僵尸进程? 它们是怎么产生的? 它们是否对系统有害? 我要怎样杀掉这些
    的头像 发表于 12-18 15:56 6490次阅读
    <b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>的产生介绍和<b class='flag-5'>危害</b>以及解决方法

    什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

    首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候子进程是一个
    的头像 发表于 07-28 10:09 5197次阅读
    什么是<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>_Linux<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>可以被“杀死”吗?

    Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动。僵尸进程
    发表于 04-02 14:40 800次阅读

    GoldBrute僵尸网络针对150多万台RDP服务器发起攻击

    新的僵尸网络出现,150多万台RDP服务器很危险!
    的头像 发表于 06-11 14:13 2880次阅读

    Linux数据中心服务器上的僵尸进程怎样正确的处理

    。虽然僵尸进程不像运行中的流氓应用程序那样占用宝贵资源,但可能会构成威胁。
    发表于 09-30 17:29 1111次阅读
    Linux数据中心<b class='flag-5'>服务器</b>上的<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>怎样正确的处理

    Linux服务器常见的网络故障排查方法

    日常工作中我们有时会遇到服务器网络不通问题,导致服务器无法正常运行。要想解决服务器网络故障问题,通常要先进行网络故障排查,这里以Linux服务器
    的头像 发表于 04-14 15:47 4092次阅读

    什么情况下服务器会停止响应?怎么排查

    服务器停止响应意味着什么?在租用网站服务器的过程中,我们总是会遇到各种各样的问题,比如最麻烦的网站服务器没有响应。让我们简单地谈谈网站服务器停止响应意味着什么,什么情况会没有响应,以及
    的头像 发表于 05-09 14:37 3158次阅读

    如何查看系统是否有僵尸进程

    进程中的指令已经执行完成,但是进程PCB结构还没有回收。   即子进程先于父进程退出后,子进程的PCB需要其父
    的头像 发表于 11-29 15:52 9459次阅读
    如何查看系统是否有<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>

    如何排查SMTP服务器故障

    丢失,严重影响业务流程和通信效率。 1. 确认故障现象 在开始排查之前,首先需要明确故障的具体表现。这可能包括: 邮件发送失败,用户收到错误通知。 邮件发送延迟,长时间未送达。 邮件丢失,收件人未收到邮件。 SMTP服务器服务
    的头像 发表于 10-30 17:42 3799次阅读