2011-02-28 120 views
1

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

所以目前要等待他们重新部署期间死亡的,我解析的ps -ef输出,抓住PID字段,杀死PID,等待60秒(这似乎是一个合理的时间与这些进程),重新检查ps -ef以确保它们已经死亡等。继续使用拷贝,chmods等。

这个解决方案对我来说感觉很蹩脚。我已经谷歌全部,并没有看到这个特定的话题上的任何东西;有一堆关于等待分岔的孩子的材料,如果只是以这种方式运行,waitpid将是完美的。

从阅读How to wait for exit of non-children processes(这是c具体)我猜测除了读取/ proc/pid之外,其他方面我可以做的其他事情不多,但我想也许会有一个perl特定的解决方案某处。有任何想法吗?

回答

4

您可以使用kill 0, $pid(成功时返回1,失败时返回0)而不是重新检查ps -ef,但可能会出现pid可能已被重用的问题。

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

除此之外,没有想法。

+1

其它疑难杂症是( )发送信号,即使信号为0,也受到Unix权限的限制。因此,例如,在用户帐户运行的Perl脚本中执行kill(0,123),其中进程ID 123由root拥有将导致返回值为假(0),尽管进程ID 123处于活动状态并且好。 – 2011-02-28 01:38:11

+2

@John Siracusa:我假设他/她有权杀死,但如果没有,您仍然可以通过测试'kill(0,$ pid)||来判断一个进程是否存在。 $! != ESRCH' – ysth 2011-02-28 02:29:11

+0

感谢输入的人,我很高兴我没有错过一些明显的'银弹'。 'kill 0,$ pid'在检查errno时很有效。 – Decker 2011-02-28 18:33:50

0

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

其他的解决方案将是等同于你的 - 检查进程表的过程的存在(虽然具体的方法可能会发生变化 - 如使用PS或直接查询内核),使用杀

+0

是的,我想也许有人在某处写了类似java的桌面集成库的东西,并且可以利用某种操作系统集成。谢谢您的帮助! – Decker 2011-02-28 18:36:27