我需要某个脚本每月运行一次(查看此问题的其他人可能需要每天/每周/每年/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 分钟执行一次任务,或者执行一项工作在指定的时间间隔内仅出现一次。”