bash:每隔x天做一次工作

时间:2009-10-21 10:24:45

标签: bash date cron

我每天都会通过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)

6 个答案:

答案 0 :(得分:6)

一个简单的解决方案是使用“一年中的一天”而不是一个月中的某一天。然后不同的月份长度没有问题。当然,你还会在年底遇到问题。 一年中的“日期”可通过date +%j获得。

如果仍然无法接受,您可以使用自1970年以来的秒数(date +%s),并除以天数* 24 * 60 * 60,然后使用其余部分。你仍然会遇到leap seconds的问题,但是它应该是正确的。

答案 1 :(得分:2)

使用cron听起来就像是一个合适的想法,因为这就是cron的用途。

一个想法是解决你的'跨月'问题:不要在几个月内考虑,而是检查自从epoch%x *秒每天的时间是否为0 ......

答案 2 :(得分:1)

我会导出一个带有最后执行日期的系统变量,并从中计算间隔。重启后它不起作用但我假设在这种情况下应该恢复间隔。

答案 3 :(得分:1)

查看at command

使用它可以让脚本在以后调用自己。

从联系手册:

  

例如,在下午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日”会被安全忽略。