2016-05-27 148 views
0

我有一个用例,我有一个进程是parent进程,它产生各种进程,它们监视每个连接的ssh连接。这个parent过程应该作为服务的一部分无休止地运行。但是,当这些连接中的一个连接关闭时,那么child进程将变为zombie进程。这样每次关闭ssh连接时都会创建多个zombie进程。删除僵尸进程

我想尽量减少zombie进程的数量。据我所知,SIGTERMSIGKILL确实删除了zombie进程。由于parent进程无休止地运行,因此无法通过等待parent来终止zombie进程。

有什么办法可以去掉僵尸进程吗?或者我理解错误的东西?

回答

1

在C编程中,您可以在父进程中使用waitpid系统调用。

在Linux命令行或shell脚本中,可以使用wait命令删除僵尸。

waitpid函数手册页,

的waitpid函数()系统调用挂起调用处理的执行,直到由PID参数指定的子状态已改变。默认情况下,waitpid()仅等待终止的子节点,但此行为可通过options参数进行修改。

语法: -

pid_t waitpid(pid_t pid, int *status, int options); 

如果你不想暂停父,那么你必须使用波纹管系统调用来清除僵尸进程。

int status; 
waitpid(0, &status, WNOHANG); 

当父进程接收到子退出状态时,则只创建僵尸进程。所以,使用waitpid和WNOHANG选项,你可以接收到子退出staus,如果提供WNOHANG选项,它不会阻塞父对象。是否有任何孩子退出,它将退出状态存储在状态变量中,并返回。否则,它不会等待,它只是返回。

尝试使用waitpid手册页来了解有关waitpid系统调用的信息。

+0

我正在使用python。我也尝试过。我用'os.waitpid(pid,os.WNOHANG)'替换了'join()',而不是'join。还有'僵尸'进程正在创建。难道我做错了什么? – nidHi

+0

您是否检查了waitpid的返回值? –

+0

我不知道在python中。但我认为我们必须将任何参数传递给os.waitpid才能获得存在状态? –