bash 如果关闭时间过长则终止进程

bash kill process if it takes too long to shutdown

我有一组 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 }'` && kill -9 `ps aux | grep supervisor| grep ${each} | awk '{print }'`)
         done

有没有更简洁的方法可以在几秒钟后终止主管进程,如果停止时间太长? 需要明确的是,我试图终止我试图用 supervisorctl -c {config path} shutdown 关闭的主管进程,而不是 supervisorctl shutdown 命令本身。

好吧,如果你看一下 bash(1)(或者 sh(1),如果你使用普通的 bourne shell),你会发现有一个变量 $!存储最后一个后台执行命令的 pid (&),因此您可以将循环体替换为:

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

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

第二次尝试

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