bash kill进程如果关闭时间太长

时间:2018-04-03 05:38:03

标签: linux bash centos rhel supervisord

我有一组supervisord运行流程,我希望自动启动和停止脚本。 但有时候supervisor shutdown命令需要很长时间才能完成,等待时间开始堆积。 目前我在做:

     for each in "${args[@]}"; do
             (supervisorctl -c configs/supervisord_${each}.conf shutdown) & sleep 8s & (kill -9 `ps aux | grep supervisor| grep ${each} | a    wk '{print $2}'` && kill -9 `ps aux | grep supervisor| grep ${each} | awk '{print $2}'`)
         done

如果需要很长时间才能停止,是否有一种更清洁的方法可以在几秒钟之后终止主管进程? 为了清楚起见,我试图通过supervisorctl -c {config path} shutdown而不是supervisorctl shutdown命令来杀死我试图关闭的管理程序进程。

1 个答案:

答案 0 :(得分:1)

好吧,如果您查看bash(1)(或sh(1)以防使用普通bourne shell),您会看到存储pid的变量$!最后一个执行后台命令(&),所以你可以用:

替换循环体
supervisorctl -c configs/supervisrod_${each}.conf shutdown &
pid_to_kill=$!
(sleep 8; kill -9 "${pid_to_kill}") &

搜索进程表是一项昂贵的操作,您应该避免。还要记住,kill -9不允许程序干净地关闭,您可能会遗漏一些数据。

第二次尝试

如果你想杀死主管(而不是你用来控制它的supervisorctl),你可以简单地检查它是否在/var/run目录中写了一些pid文件。因为它是常用的,如果您需要一个不相关的过程(如supervisorctl,没有父母父子关系)来访问其pid并能够向其发送信号。