我每天都会通过cron运行一个bash脚本。
在这个bash中我想运行一些命令但是每隔x天(x是固定的,将是3,4或5我目前不知道)
我可以测试每月/ x的除法日的剩余部分是否等于0
day_of_month%x = 0
我将工作一个月但不总是在一个月之间,例如4月份的月份 - 可能是x = 3
1 2 3 4 5 6 7 8 9 ... 27 28 29 30 31 1 2 3 4 5 6 7 8 9 ... 27 28 29 30
x x x ... x x x x x ... x x
这不是什么大问题,但有没有其他方法可以做到这一点?
PS:我不想爆炸我的脚本并制作2个cron作业(每天一个:*,另一个xvevery x天:* / x)
答案 0 :(得分:6)
一个简单的解决方案是使用“一年中的一天”而不是一个月中的某一天。然后不同的月份长度没有问题。当然,你还会在年底遇到问题。
一年中的“日期”可通过date +%j
获得。
如果仍然无法接受,您可以使用自1970年以来的秒数(date +%s
),并除以天数* 24 * 60 * 60,然后使用其余部分。你仍然会遇到leap seconds的问题,但是它应该是正确的。
答案 1 :(得分:2)
使用cron听起来就像是一个合适的想法,因为这就是cron的用途。
一个想法是解决你的'跨月'问题:不要在几个月内考虑,而是检查自从epoch%x *秒每天的时间是否为0 ......
答案 2 :(得分:1)
我会导出一个带有最后执行日期的系统变量,并从中计算间隔。重启后它不起作用但我假设在这种情况下应该恢复间隔。
答案 3 :(得分:1)
使用它可以让脚本在以后调用自己。
从联系手册:
例如,在下午4点开始工作 从现在开始,你会做的 下午4点+ 3天,在7月31日上午10点开始工作,你会做的 上午10点 7月31日明天凌晨1点开始工作,你会在凌晨1点做 明天。
答案 4 :(得分:1)
如果我有这个问题,我会告诉cron每天运行一次脚本,在脚本中我会计算是否需要完成工作。这样,你可以完全控制它。
例如,
dayno=`date +%d`
let divided=daynum%3
if [ $divided == 0 ] ; then
exit 0
fi
# real work begins here
此脚本适用于任何使用bash的系统。
答案 5 :(得分:0)
你的工作是否需要每天运行?也就是说,当你的计算结果不是0时,它会做些什么。如果没有,你可以在cron中设置一个工作:
0 12 3,6,9,12,15,18,21,24,27,30 * * <your job>
它会每隔三天运行一次(在我的例子中午12点)。
我很确定“2月30日”会被安全忽略。