我有一个脚本,用于在自定义服务器环境中重新部署几个程序(即:不是已建立的具有代码热交换的标准容器)。为此,它会关闭服务器进程,但这些进程需要一些时间才能完全关闭所有连接。这些不是 perlscript 的子进程。它们通常一次运行数百天,所以我宁愿不必将服务器进程包装在 perlscripts 中,这样我就可以 fork 它们以在数月或数年后优雅地关闭它们。
所以目前要等待它们在重新部署期间死掉,我正在解析 ps -ef
的输出,获取 pid 字段,杀死那个 pid,等待 60 秒,(这似乎是合理的这些进程的时间),重新检查 ps -ef
以确保它们已死,等等。继续进行复制、chmod 等。
我觉得这个解决方案很蹩脚/笨拙。我到处搜索,但没有看到关于这个特定主题的任何内容; waiting on forked children的资料一大堆,waitpid要是这样操作就完美了。
来自阅读How to wait for exit of non-children processes (这是特定于 c
的)我猜除了读取/proc/pid 之外,我真的无能为力,但我想也许会有一个特定于 perl 的解决方案某处。有什么想法吗?
最佳答案
您可以使用 kill 0, $pid
(成功时返回 1,失败时返回 0)而不是重新检查 ps -ef,但这可能会导致 pid 可能已被重用。
如果您已经有 ps 解析代码,可能不值得切换,但是有 Proc::ProcessTable .
除此之外,没有其他想法。
关于Perl,等待非子进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5137187/