我有一个脚本用于在自定义服务器环境中重新部署几个程序(即:不是具有代码热启动的已建立的标准容器)。为此,它会关闭服务器进程,但这需要一些时间来完全关闭所有连接。这些不是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特定的解决方案某处。有任何想法吗?
其它疑难杂症是( )发送信号,即使信号为0,也受到Unix权限的限制。因此,例如,在用户帐户运行的Perl脚本中执行kill(0,123),其中进程ID 123由root拥有将导致返回值为假(0),尽管进程ID 123处于活动状态并且好。 – 2011-02-28 01:38:11
@John Siracusa:我假设他/她有权杀死,但如果没有,您仍然可以通过测试'kill(0,$ pid)||来判断一个进程是否存在。 $! != ESRCH' – ysth 2011-02-28 02:29:11
感谢输入的人,我很高兴我没有错过一些明显的'银弹'。 'kill 0,$ pid'在检查errno时很有效。 – Decker 2011-02-28 18:33:50