我有一个 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
主要有两种方法:
如果脚本检测到另一个实例正在运行,则让脚本退出。只需在脚本开头添加以下几行:
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
)。这意味着如果您正在运行另一个名称相同的无关脚本,它仍会被检测到。另一方面,这也意味着即使您从符号链接调用该脚本,它也会正常工作。您更喜欢哪一个取决于您的用例。如果文件存在,则使用锁定文件并退出脚本:
#!/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 有用)
还有其他有用的包装器,例如:
运行这一项、持续运行一项、保持一项运行、运行一项直至成功、运行一项直至失败