文章目录

  • 1. 僵尸进程概述
  • 2. ps - 系统进程操作
  • 3. 僵尸进程处理方法


1. 僵尸进程概述

简述

  • 在Linux系统中若子进程退出,父进程会使用 waitwaitpid 函数进行回收子进程的资源,并获得子进程的终止状态。
    但如果父进程先于子进程结束,则子进程成为孤儿进程。孤儿进程将被 init进程(进程号为1)领养,并由 init 进程对孤儿进程完成状态收集工作。而如果子进程先于父进程退出,同时父进程太忙了,无瑕回收子进程的资源,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。

解决方法

  • 僵尸进程其实已经就是退出的进程,因此无法再利用kill命令杀死僵尸进程。僵尸进程的罪魁祸首是父进程没有回收它的资源,那我们可以想办法它其它进程去回收僵尸进程的资源,这个进程就是 init 进程。因此我们可以直接杀死父进程,init 进程就会很善良地把那些僵尸进程领养过来,并合理的回收它们的资源,那些僵尸进程就得到了妥善的处理了

2. ps - 系统进程操作

ps:(process status):显示当前进程的状态.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

表头解释

  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的记忆体使用率
  • VSZ: 占用的虚拟记忆体大小
  • RSS: 占用的记忆体大小
  • TTY: 终端的次要装置号码 (minor device number of tty)
  • STAT: 该行程的状态:
  • D: 无法中断的休眠状态 (通常 IO 的进程)
  • R: 正在执行中
  • S: 静止状态
  • T: 暂停执行
  • Z: 不存在但暂时无法消除 - 僵尸进程判断标准
  • W: 没有足够的记忆体分页可分配
  • <: 高优先序的行程
  • N: 低优先序的行程
  • L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
  • START: 行程开始时间
  • TIME: 执行的时间
  • CMD:所执行的指令

3. 僵尸进程处理方法

# 寻找僵尸进程
$ ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
# stat 显示进程状态
# ppid 显示父进程ID
# pid 显示进程ID
# cmd 显示启动进程的命令

# 寻找进程
$ ps -ef | grep $pid
# 寻找父进程
$ ps -ef | grep $ppid
# 寻找对应的cmd,找到对应的进程服务进行释放进程操作
$ kill -9 $ppid
# 或者
$ pkill $ppid