如何防止 CronJob 运行两次?

如何防止 CronJob 运行两次?

我有一个 Cron Job 脚本,每 4 分钟运行一次。在极少数情况下,脚本不会在 4 分钟内完成。这会导致问题。

我如何检查如果前一个脚本尚未完成则跳过当前运行

预期行为:

10:00 : Script A starts
10:04 : Script A2 starts - it finds that script A was not finish so this script aborts. Simply finish without doing nothing.
10:06 : Script A finish 
10:08 : Script A3 starts - no other scripts running so it continue

注意:A、A2、A3 是相同的脚本(只是时间不同)!它不应该考虑可能正在运行的其他脚本

答案1

主要有两种方法:

  1. 如果脚本检测到另一个实例正在运行,则让脚本退出。只需在脚本开头添加以下几行:

    if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
         echo "Another instance of the script is running. Aborting."
         exit
    fi
    

    $0是脚本的名称,而${0##*/}是脚本的名称,其中删除了最后一个字符/(因此,/path/to/script.sh变为script.sh)。这意味着如果您正在运行另一个名称相同的无关脚本,它仍会被检测到。另一方面,这也意味着即使您从符号链接调用该脚本,它也会正常工作。您更喜欢哪一个取决于您的用例。

  2. 如果文件存在,则使用锁定文件并退出脚本:

    #!/bin/bash
    
    if [ -e "/tmp/i.am.running" ]; then
        echo "Another instance of the script is running. Aborting."
        exit
    fi
    else
        touch  "/tmp/i.am.running"
    fi
    
    ## The rest of the script goes here
    
    rm "/tmp/i.am.running"
    

答案2

您可以使用run-one命令 ( apt-get install run-one)

https://manpages.ubuntu.com/manpages/focal/man1/run-one.1.html

run-one - 每次只运行某个命令和一组唯一参数的一个实例(例如,对于 cronjobs 有用)

还有其他有用的包装器,例如:

运行这一项、持续运行一项、保持一项运行、运行一项直至成功、运行一项直至失败

相关内容