查看并杀死defunct僵尸进程

defunct进程如何直接kill掉;只要杀死它的父进程,defunct进程就自动消失了.

查看defunct进程 

ps -e -o ppid,stat | grep Z | cut -d " " -f1

杀死

ps -e -o ppid,stat | grep Z | cut -d " " -f1| xargs kill -9
 

defunct进程的产生是因为子进程先于父进程结束了,会保留一些信息(进程号等)留给父进程获取其状态,这些保留的信息直到父进程通过调用wait/waitpid时才会释放,一旦父进程调用wait/waitpid就会释放。如果子进程先于父进程结束,且父进程没有调用wait/waitpid就产生僵尸进程。

如果父进程先于子进程结束,系统会用init来接管它,成为它的父进程,并对其进行清理。所以只要杀掉父进程,defunct的子进程也就会被回收了。

1、wait:子进程结束时,系统向其父进程发送SIGCHILD信号;父进程调用wait函数后阻塞;父进程被SIGCHILD信号唤醒然后去回收僵尸子进程;SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程;若父进程没有任何子进程则wait返回错误。

2、wait的参数status。status用来返回子进程结束时的状态,父进程通过wait得到status后,就可以知道子进程的一些结束状态信息

3、wait的返回值pid_t,这个返回值就是本次wait回收的子进程的PID。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态。

你可能感兴趣的:(linux)