【问题标题】:Perl, waiting for non-child process to exitPerl,等待非子进程退出
【发布时间】:2011-07-05 11:07:42
【问题描述】:

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

所以目前等待他们在重新部署期间死亡,我正在解析ps -ef 的输出,获取 pid 字段,杀死该 pid,等待 60 秒,(对于这些进程来说,这似乎是一个合理的时间),重新检查ps -ef 以确保他们已经死亡等。继续复制、chmod 等。

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

通过阅读How to wait for exit of non-children processes(具体为c)我猜除了阅读 /proc/pid 之外,我真的无能为力,但我想也许会有一个特定于 perl 的某处的解决方案。有什么想法吗?

【问题讨论】:

    标签: perl process kill


    【解决方案1】:

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

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

    除此之外,没有任何想法。

    【讨论】:

    • 另一个问题是使用 kill() 发送信号,即使是信号 0,也需要 Unix 权限。因此,例如,在进程 id 123 由 root 拥有的用户帐户运行的 Perl 脚本中执行 kill(0, 123) 将导致错误 (0) 返回值,尽管事实上进程 id 123 是活动的并且好吧。
    • @John Siracusa:我假设她/他有权杀死,但如果没有,您仍然可以通过测试kill(0,$pid) || $! != ESRCH来判断进程是否存在
    • 感谢大家的投入,我很高兴我没有遗漏一些明显的“银弹”。 kill 0,$pid 方法在检查 errno 时效果很好。
    【解决方案2】:

    在 Unix \ Linux 中,只有父进程在进程退出父进程时才会收到信号 - 这是 OS 功能,与语言无关。

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

    【讨论】:

    • 是的,我想也许有人在某个地方写过类似 java 'desktop integration' 库的东西,我可以利用某种操作系统集成。感谢您的帮助!
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2021-11-19
    • 2013-09-15
    相关资源
    最近更新 更多