Perl,等待非子进程退出

时间:2011-02-28 00:44:56

标签: perl process kill

我有一个脚本,用于在自定义服务器环境中重新部署一些程序(即:不是已建立的具有代码hotswapping的标准容器)。为此,它会关闭服务器进程,但这些需要一些时间才能完全关闭所有连接。这些不是perlscript的子进程。它们通常一次运行数百天,所以我宁愿不必将服务器进程包装在perlscripts中,这样我就可以将它们分叉,以便在数月或数年之后优雅地关闭它们。

所以目前在重新部署期间等待他们死亡,我正在解析ps -ef的输出,抓住pid字段,杀死那个pid,等待60秒,(这似乎是这些过程的合理时间) ,重新检查ps -ef以确保它们已经死亡,等等。继续复制,chmods等。

这个解决方案让我觉得蹩脚/笨拙。我已经谷歌了,并没有看到任何关于这个特定主题;有一堆关于等待分叉孩子的材料,如果只是以这种方式操作,waitpid将是完美的。

从阅读How to wait for exit of non-children processes(具体是c)我猜我除了阅读/ proc / pid之外别无他法,但我觉得可能会有某处特定于perl的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用kill 0, $pid(成功时返回1,失败时返回0)而不是重新检查ps -ef,但这可能会导致pid可能被重用。

如果你已经有ps解析代码,那么切换它可能是不值得的,但是Proc::ProcessTable

除此之外,没有想法。

答案 1 :(得分:0)

在Unix \ Linux中,只有父进程在进程退出父进程时才会收到信号 - 这是一个操作系统功能,而不是特定于语言的。

其他解决方案与您的解决方案相同 - 检查进程表是否存在进程(尽管具体方法可能有所不同 - 例如使用ps或直接查询内核)