1.什么是 Linux 僵尸进程(Zombie Process)Linux 中的僵尸进程(Zombie Process)是一个已经结束执行、但其父进程尚未读取其退出状态的进程。
核心概念:
- 当子进程调用 exit() 或被信号终止时,内核不会立刻完全清理它,而是在进程表中保留一条记录,包含进程 ID、退出码、运行时间等。
- 此时进程状态变为 Z(zombie),不再占用 CPU 或内存资源,只占用一个进程表条目。
- 父进程需要调用 wait() 或 waitpid() 来"回收"子进程,读取其退出状态后,进程表条目才会被释放。
2.如何批量在 Linux 实例上显示僵尸进程
参考如下脚本:
#!/bin/bashprocesses=$(ps ax -o user,pid,ppid,pgid,args,stat,start,time)zombies=$(echo -e "${processes}" | grep -E "\s(Z|z|Z.*)\s")if [ $? == 1 ]; then echo "no zombie processes exists on machine"else echo -e "${processes}" | head -1 echo "$zombies"fi
processes=$(ps ax -o user,pid,ppid,pgid,args,stat,start,time)
执行 ps ax 显示所有进程(包括其他用户的进程),并通过 -o 自定义输出列:user:进程所有者pid:进程IDppid:父进程IDpgid:进程组IDargs:完整命令行参数stat:进程状态(如 R 运行、S 睡眠、Z 僵尸等)start:进程启动时间time:累计CPU时间
将命令输出保存到变量 processes 中。
zombies=$(echo -e "${processes}" | grep -E "\s(Z|z|Z.*)\s")
echo -e "${processes}":输出 processes 的内容,-e 用于解释转义字符(虽然这里并没有特殊转义,但习惯保留)。grep -E:使用扩展正则表达式进行匹配。正则 \s(Z|z|Z.*)\s:\s 匹配空白字符(空格、制表符等)。(Z|z|Z.*) 匹配 Z 或 z 或 Z 后跟任意字符(Z.*)。实际上 Z.* 已经包含了 Z,可能意图是匹配 Z 或 z 以及 Z+其他,但通常僵尸进程状态为大写 Z。整体匹配包含状态字段的行。匹配结果(即僵尸进程的行)保存到变量 zombies。