【问题标题】:bash kill process if it takes too long to shutdown如果关闭时间过长,则 bash 杀死进程
【发布时间】:2018-09-12 08:38:19
【问题描述】:

我有一组 supervisord 运行进程,我想使用脚本自动启动和停止。 但有时主管关闭命令需要很长时间才能完成,并且等待时间开始堆积。 目前我正在做:

     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 命令本身来终止我试图关闭的主管进程。

【问题讨论】:

    标签: linux bash centos rhel supervisord


    【解决方案1】:

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

    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 并能够向它发送信号。

    【讨论】:

    • 嗨 Luis 很抱歉造成混乱,我正在尝试终止正在运行的主管进程,主管关闭需要很长时间才能完成,而不是 supervisorctl -c {conf name} shutdown 进程本身。我想放弃尝试关闭它,而是将其杀死。
    • 主管是否在/var/run 目录中写入(常用)它的 pid?如果是这样,可能最好在那里挖掘,因为从ps(1) 输出中收集信息需要大量资源。如果主管是您编写的程序,最好让它在某处编写它的 pid,然后...... supervisorctl 程序有什么用? (如果它不能正常工作)我认为你需要更多地考虑这一点。
    • 是的,每个进程的 pid 都被写入 ~/tmp/pids/{app}。谢谢!
    • ;) 现在我必须将我的 cmets 添加到响应中......否则我会被否决:)
    • 对不起 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多