【问题标题】:Removing a zombie process删除僵尸进程
【发布时间】:2016-05-27 07:32:33
【问题描述】:

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

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

有什么办法可以去掉僵尸进程?或者我理解错了什么?

【问题讨论】:

    标签: linux process signals zombie-process


    【解决方案1】:

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

    在linux命令行或shell脚本中,可以使用wait命令来移除僵尸。

    waitpid 手册页,

    waitpid() 系统调用暂停调用进程的执行,直到 pid 参数指定的子进程改变状态。默认情况下,waitpid() 仅等待终止的子节点,但此行为可通过选项参数进行修改。

    语法:-

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

    如果你不想暂停父进程,那么你可以使用下面的系统调用来清除僵尸进程。

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

    当父进程确实收到子退出状态时,只会创建僵尸进程。因此,使用带有 WNOHANG 选项的 waitpid,您可以获得子退出状态,如果提供了 WNOHANG 选项,它不会阻止父级。是否有任何子退出它将退出状态存储在状态变量中,然后返回。否则它不会等待,它只是返回。

    尝试waitpid 手册页以阅读有关 waitpid 系统调用的信息。

    【讨论】:

    • 我正在使用 python。我也试过了。我用os.waitpid(pid, os.WNOHANG) 代替了join()。仍在创建zombie 进程。我做错了吗?
    • 你检查过waitpid的返回值吗?
    • 我不知道在 python 中。但我认为我们必须将任何参数传递给 os.waitpid 才能获得存在状态?
    • @nidHi 如果您将 pid 传递给 os.waitpid,那么它只会清除一个僵尸进程。不要给 pid,而是给 os.waitpid 中的 0。我认为它会起作用。
    • 是的...我已明智地编写了一个错误代码...它现在正在使用waitpid()...谢谢您的帮助..!
    猜你喜欢
    • 2012-03-18
    • 2021-07-26
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多