如果关闭过程时间过长,如何使用bash杀死进程

3

我有一组使用supervisord运行的进程,我希望能够用脚本自动化启动和停止这些进程。 但是有时候,supervisor的关闭命令执行时间过长,导致等待时间越来越多。 目前我的做法是:

     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

如果超时停止太久,是否有更干净的方法可以在几秒钟后杀死supervisor进程?
明确一点,我正在尝试关闭使用supervisorctl -c {config path} shutdown命令关闭的supervisor进程,而不是supervisorctl shutdown命令本身。

1个回答

2

如果你查看bash(1)(或者在你使用普通的 Bourne shell 的情况下是sh(1)),你会发现有一个变量$!,它存储了最后执行的后台命令(&)的进程 ID。因此,您可以用以下内容替换循环体:

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

搜索进程表是一个代价昂贵的操作,应该避免使用。同时请记住,使用 kill -9 命令无法让程序正常关闭,可能会导致数据丢失。

第二次尝试

如果你想杀死 supervisor 进程(而不是用来控制它的 supervisorctl 进程),你可以简单地检查是否在 /var/run 目录中写入了一些 pid 文件。由于这是常见的用法,如果需要让一个无关的进程(如 supervisorctl)获取其 pid 并能够向其发送信号。


嗨Luis,抱歉让你感到困惑。我正在尝试终止正在运行的supervisor进程,因为supervisor关闭需要太长时间来完成,而不是supervisorctl -c {conf name} shutdown进程本身。我想放弃尝试关闭它,而是直接将其杀掉。 - Unpossible
主管程序是否会在/var/run目录中写入其pid(常见用法)?如果是这样,最好挖掘一下那里,因为从ps(1)输出中收集信息需要大量资源。如果主管程序是您编写的程序,将其pid写入某个地方可能是一个好主意,然后...那么supervisorctl程序有什么用处呢?(如果它不能正确地完成工作)我认为你需要更多的思考。 - Luis Colorado
是的,每个进程的pid都写入到~/tmp/pids/{app}中。谢谢! - Unpossible
现在我必须添加我的评论到响应中...否则我会被踩下来 :) - Luis Colorado
抱歉,对此感到抱歉 :-) - Unpossible

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接