首页 文章

Perl,等待非子进程退出

提问于
浏览
2

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

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

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

从阅读How to wait for exit of non-children processes(具体是 c )我'm guessing there'除了阅读/ proc / pid之外我真的不怎么做,但我想也许在那里某处有特定于perl的解决方案 . 有任何想法吗?

2 回答

  • 0

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

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

  • 4

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

    如果你已经有ps解析代码,那么's probably not worth it to switch, but there' s Proc::ProcessTable .

    除此之外,没有想法 .

相关问题