Perl,等待非子进程退出

标签 perl process kill

我有一个脚本,用于在自定义服务器环境中重新部署几个程序(即:不是已建立的具有代码热交换的标准容器)。为此,它会关闭服务器进程,但这些进程需要一些时间才能完全关闭所有连接。这些不是 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/

相关文章:

c - 程序fork 4个子进程,每个子进程都会做不同的操作

c# - 如何从网站在客户端上执行应用程序?

bash - 是否有一个 shell 命令可以杀死所有后台 tail 进程

perl - 使用匿名 subs 最小化 Perl 中的子范围是一种好习惯吗?

perl - 分析 Perl 模块中的子模块依赖关系

regex - 如何为 Makefile 编写 Perl 单行,以便我可以将文字\n 转换为换行符?

c - C 中信号的进程间通信 - 为什么会失败?

Bash隐藏 "killed"

signals - SIGTERM 无法杀死进程

linux - @INC XFileSharing 2.5 中的 Perl 错误 : Can't locate XFileConfig. pm