【问题标题】:Kill processes after N minutes waiting | shell scripting等待 N 分钟后终止进程 |外壳脚本
【发布时间】:2015-12-26 05:57:36
【问题描述】:

我正在发布我们与 cron 一起使用的 sh 脚本的一部分,以对我们的 Oracle EBIZ 进行冷备份。它在大多数情况下都有效,偶尔会失败,因为脚本监控的进程之一无法停止/终止

代码部分

    su - applprod -c /home/applprod/scripts/Apps_stop.sh
    FNDPROCESS=`ps -ef | grep FNDLIBR | grep applprod | wc -l`
    echo 'We have still running ' $FNDPROCESS ' FNDLIBR for PROD'
    echo 'Please wait...for ' $FNDPROCESS ' seconds!!'

    NPROCESS=$FNDPROCESS
    while [ $FNDPROCESS -gt 0 ]
    do
    FNDPROCESS=`ps -ef | grep FNDLIBR | grep applprod | wc -l`
    if [ $FNDPROCESS -ne $NPROCESS ]
      then
    echo 'We have still running ' $FNDPROCESS ' FNDLIBR for PROD'
    echo 'Please wait...for ' $FNDPROCESS ' seconds!!'
    sleep $FNDPROCESS
    NPROCESS=$FNDPROCESS
    fi
    done    

通常循环在 3-4 分钟内完成,除非 FNDLIBR 进程之一失败

现在我们需要为上面的循环添加一个最长 30 分钟的等待时间,因此,如果等待时间超过 29 分钟,脚本应该强制杀死所有匹配 'FNDLIBR'(并发管理器)的进程并退出循环。

请帮帮我:)

感谢和问候,

【问题讨论】:

  • 也许这个问题已经回答了:stackoverflow.com/a/11198713/5396827
  • 你好@LaPriWa 谢谢。我对 shell 脚本有点陌生。我已经检查了您建议的帖子,看起来我可以更改我现有的脚本以反映基于秒的循环。谢谢你:)

标签: shell process scripting timeout kill


【解决方案1】:

您可以使用sleep 1740 您的程序将暂停 29 分钟,在此行下方您可以编写代码来杀死所有仍在运行的进程。

【讨论】:

  • 首先阅读您的答案听起来很有希望:),但是,正如我在查询中所说的那样,循环偶尔会卡住。因此,在通常情况下,当整个循环在 3-4 分钟内完成时,每次运行等待 29 分钟有点过头了。不过,我肯定会考虑你的建议。谢谢
  • 不要在循环中休眠。在它之前休眠 29 分钟,然后在其中不休眠的情况下启动循环,然后循环将杀死其中的所有进程。
【解决方案2】:

我会使用以下方法:

  • 使用timeout 启动您的shell 脚本,并指定最大已用时间(29 分钟?)和在超时时发送的信号(我建议使用 SIGUSR1、SIGUSR2 左右)
  • 修改你的 shell 脚本以“捕获”上面的信号并杀死匹配 FNDLIBR 的进程

这样,如果一切正常,该过程将需要 3 或 4 分钟,如果脚本监视器无法终止,则最多需要 30 分钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多