确保脚本每隔一段时间运行一次的最佳方法?

确保脚本每隔一段时间运行一次的最佳方法?

我需要某个脚本每月运行一次(查看此问题的其他人可能需要每天/每周/每年/5 天运行一次,等等)。

我知道我可以使用 cron 来做到这一点:

0 0 1 * * ./script.sh

但是,如果机器在该时间间隔内恰好离线(例如在特定月份的第一天断电)怎么办?

有没有一个优雅的解决这个问题?或者我是否必须在该脚本中包含一个子例程来设置一个I've-run-this-month-already值,然后每个月的每天(或启动时)运行另一个脚本来检查该值?

更新:

我需要我的脚本每月月初运行一次。在编写脚本来完成许多事情时,我创建了下面的代码。我只是把它放在这里以防有人在发现这个问题后发现它有用。

# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
        # CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
        echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi

# CREATE A NEW FILE EVERY TIME THIS SCRIPT IS RUN WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/this_month

# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
        # RUN YOUR RELEVANT CODE HERE #
        echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month     # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
fi

答案1

您可以使用阿纳克朗为此,它被设计为以一定的时间间隔运行作业,而不假设系统连续运行。如果某个作业应该每月运行一次,Anacron 将检查它是否在上个月运行过,如果没有运行则运行它(并且记住,它不需要在下个月再次运行它)。

在 Debian 衍生品中,Anacron 与 Cron 配合得很好,可以适当地处理/etc/cron.{daily,weekly,monthly}(因此您只需将每月任务定义为 中的每月作业/etc/cron.monthly,它就会适当地运行)。

在其他系统上,您可以在中定义每月任务/etc/anacrontab

答案2

看来 fcron 是正确的工具:“fcron 不会假设您的系统是一直运行还是定期运行:例如,您可以告诉 fcron 在系统运行时间的每 x 小时 y 分钟执行一次任务,或者执行一项工作在指定的时间间隔内仅出现一次。”

相关内容