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 并能够向其发送信号。
我有一组 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 并能够向其发送信号。