1. 产生的原因
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
2. Linux系统中如何查看是否有僵死进程
通过命令ps -el
,再查看第二列,是否有标志为Z
的进程,如果有,则表示该进程是僵死进程。
图1:ps
命令后的结果图。
3. 如何杀死僵死进程
僵死进程用kill -9
命令是杀不掉的,只能通过杀死其父进程来杀死它(当然重启服务器也是可以的)。
先通过僵死进程的PID找到其父进程的PID,也叫PPID。再通过kill -2 PPID
杀掉父进程。如果kill -2
杀不掉,则先杀掉父进程的其它子进程(如果有),再kill -9 PPID
。
-
找父进程
ps -ef | grep PID -
如父进程没其它子进程
kill -9 PPID -
如有其它子进程,千万别直接把父进程干了,不然这些子进程就都变成了孤儿进程,具体影响看实现。
ps -ef | grep PPID (找到所有子进程,然后一个一个杀掉)
一般来说,通过kill -2 PPID
是可以将父子进程都干掉的,如nginx的master进程会fork很多worker进程,你用kill -2杀掉master进程时,worker进程也会一起被杀掉。但如果你直接通过kill -9把master干掉了,那这些worker进程就成了孤儿进程了,虽然仍可以正常处理请求工作,但后续配置变更等都将无效。