删除僵尸进程
Removing a zombie process
我有一个用例,我有一个进程是 parent
进程,它生成各种 child
进程,每个进程监视一个 ssh
连接。这个 parent
过程应该 运行 无休止地作为服务的一部分。但是,当其中一个 ssh
连接关闭时,该 child
进程将变为 zombie
进程。这样,每次 ssh
连接关闭时都会创建许多 zombie
进程。
我想尽可能减少 zombie
进程的数量。据我所知,SIGTERM
或 SIGKILL
确实删除了 zombie
进程。由于 parent
进程 运行 无休止地等待 parent
终止,无法删除 zombie
进程。
有什么办法可以去除僵尸进程吗?或者我理解错了什么?
在C编程中,可以在parent进程中使用waitpid系统调用。
在linux命令行或shell脚本中,您可以使用等待命令来删除僵尸。
waitpid 联机帮助页,
waitpid() 系统调用暂停调用进程的执行,直到由 pid 参数指定的 child 改变了状态。默认情况下,waitpid() 仅等待终止 children,但此行为可通过选项参数进行修改。
语法:-
pid_t waitpid(pid_t pid, int *status, int options);
如果你不想暂停parent,那么你已经使用下面的系统调用来清除僵尸进程。
int status;
waitpid(0, &status, WNOHANG);
当 parent 进程收到 child 退出状态时,只会创建僵尸进程。因此,使用带有 WNOHANG 选项的 waitpid,您可以获得 child 退出状态,如果提供了 WNOHANG 选项,它不会阻止 parent。是否有任何 child 退出,它将退出状态存储在状态变量中,并且 return。否则它不会等待,它只是 return.
尝试 waitpid 手册页阅读有关 waitpid 系统调用的信息。
我有一个用例,我有一个进程是 parent
进程,它生成各种 child
进程,每个进程监视一个 ssh
连接。这个 parent
过程应该 运行 无休止地作为服务的一部分。但是,当其中一个 ssh
连接关闭时,该 child
进程将变为 zombie
进程。这样,每次 ssh
连接关闭时都会创建许多 zombie
进程。
我想尽可能减少 zombie
进程的数量。据我所知,SIGTERM
或 SIGKILL
确实删除了 zombie
进程。由于 parent
进程 运行 无休止地等待 parent
终止,无法删除 zombie
进程。
有什么办法可以去除僵尸进程吗?或者我理解错了什么?
在C编程中,可以在parent进程中使用waitpid系统调用。
在linux命令行或shell脚本中,您可以使用等待命令来删除僵尸。
waitpid 联机帮助页,
waitpid() 系统调用暂停调用进程的执行,直到由 pid 参数指定的 child 改变了状态。默认情况下,waitpid() 仅等待终止 children,但此行为可通过选项参数进行修改。
语法:-
pid_t waitpid(pid_t pid, int *status, int options);
如果你不想暂停parent,那么你已经使用下面的系统调用来清除僵尸进程。
int status;
waitpid(0, &status, WNOHANG);
当 parent 进程收到 child 退出状态时,只会创建僵尸进程。因此,使用带有 WNOHANG 选项的 waitpid,您可以获得 child 退出状态,如果提供了 WNOHANG 选项,它不会阻止 parent。是否有任何 child 退出,它将退出状态存储在状态变量中,并且 return。否则它不会等待,它只是 return.
尝试 waitpid 手册页阅读有关 waitpid 系统调用的信息。