Linux 从1月16日开始,每10天设置一个cron
如何设置从1月16日开始每隔10天执行一次cron?这够了吗Linux 从1月16日开始,每10天设置一个cron,linux,unix,cron,crontab,cron-task,Linux,Unix,Cron,Crontab,Cron Task,如何设置从1月16日开始每隔10天执行一次cron?这够了吗 30 7 16-15/10 * * command >/dev/null 上述活动从上午7:30开始,每月16日结束,下个月15日结束,每10天重复一次。我不认为我上面所说的是正确的。有谁能告诉我如何设置cron,以便将月末考虑在内,并且从2016年1月16日开始每隔10天执行一次命令 0 30 7 1/10 * ? * command >/dev/null 上述快车的输出为 Saturday, January 16,
30 7 16-15/10 * * command >/dev/null
上述活动从上午7:30开始,每月16日结束,下个月15日结束,每10天重复一次。我不认为我上面所说的是正确的。有谁能告诉我如何设置cron,以便将月末考虑在内,并且从2016年1月16日开始每隔10天执行一次命令
0 30 7 1/10 * ? * command >/dev/null
上述快车的输出为
Saturday, January 16, 2016 7:30 AM
1. Thursday, January 21, 2016 7:30 AM
2. Sunday, January 31, 2016 7:30 AM
3. Monday, February 1, 2016 7:30 AM
4. Thursday, February 11, 2016 7:30 AM
5. Sunday, February 21, 2016 7:30 AM
表达式的输出
i.e 30 7 16-15/10 * * command >/dev/null
2016-01-15 07:30:00
2016-02-15 07:30:00
2016-03-15 07:30:00
2016-04-15 07:30:00
2016-05-15 07:30:00
2016-06-15 07:30:00
2016-07-15 07:30:00
2016-08-15 07:30:00
2016-09-15 07:30:00
2016-10-15 07:30:00
最接近的语法如下所示:
30 7 1-30/10 * *
30 7 1-31/10 * *
30 7 1-28/10 * *
30 7 1-29/10 * *
您可以在这里测试cron表达式
上述快车的输出为
Saturday, January 16, 2016 7:30 AM
1. Thursday, January 21, 2016 7:30 AM
2. Sunday, January 31, 2016 7:30 AM
3. Monday, February 1, 2016 7:30 AM
4. Thursday, February 11, 2016 7:30 AM
5. Sunday, February 21, 2016 7:30 AM
表达式的输出
i.e 30 7 16-15/10 * * command >/dev/null
2016-01-15 07:30:00
2016-02-15 07:30:00
2016-03-15 07:30:00
2016-04-15 07:30:00
2016-05-15 07:30:00
2016-06-15 07:30:00
2016-07-15 07:30:00
2016-08-15 07:30:00
2016-09-15 07:30:00
2016-10-15 07:30:00
最接近的语法如下所示:
30 7 1-30/10 * *
30 7 1-31/10 * *
30 7 1-28/10 * *
30 7 1-29/10 * *
您可以在这里测试cron表达式正如William所建议的,cron本身无法处理这种复杂性。但是,您可以更频繁地运行cron作业,并使用其他逻辑。比如,
30 7 16-31 1 * date '+\%j' | grep -q '0$' && yourcommand
30 7 * 2-12 * date '+\%j' | grep -q '0$' && yourcommand
此日期格式字符串打印一年中的日期,从001到365。grep-q
将进行模式匹配,不打印结果,而是根据找到的结果返回失败的成功。每10天,一年中的某一天以零结尾。在那些日子里,yourcommand
会运行
这与年度滚动有关。一个更复杂的替代方案可能是对日期'+%s'
(纪元秒)的产品进行类似的grep,但您需要进行数学运算,将秒转换为天,以便grep
进行分析。这可能有效(您应该测试):
(当然,还要加上1月16日的逻辑。)
这取决于shell算法只能处理整数这一事实。壳只是截断而不是圆化
更新
在对另一个答案的评论中,您阐明了自己的要求:
该命令应在1月16日开始执行,并在1月26日、2月5日、2月15日等日期继续执行–jai
为此,第二代方法可能是正确的方向
% date -v1m -v16d -v7H -v30M -v0S '+%s'
1452947400
(我在FreeBSD中,因此这些参数指向date
)
此表达式从当前时间中减去1月16日上午7:30(我的时区)的历元秒,并测试结果差是否可被10天整除。如果是,则表达式的计算结果为true,并运行yourcommand。请注意,$((0%$x))
对于$x的任何值计算为0
如果cron特别忙,无法在一秒钟内完成工作,那么这可能会出错
如果您想让它变得更复杂(甚至可能是如此复杂),我建议您将逻辑移到一个单独的shell脚本中,以处理日期比较数学。特别是如果你计划增加一个假因素,让工作错过1秒钟的时间。。这可能是多行脚本,在一个cronjob条目中维护很困难。正如William所说,cron本身无法处理这种复杂性。但是,您可以更频繁地运行cron作业,并使用其他逻辑。比如,
30 7 16-31 1 * date '+\%j' | grep -q '0$' && yourcommand
30 7 * 2-12 * date '+\%j' | grep -q '0$' && yourcommand
此日期格式字符串打印一年中的日期,从001到365。grep-q
将进行模式匹配,不打印结果,而是根据找到的结果返回失败的成功。每10天,一年中的某一天以零结尾。在那些日子里,yourcommand
会运行
这与年度滚动有关。一个更复杂的替代方案可能是对日期'+%s'
(纪元秒)的产品进行类似的grep,但您需要进行数学运算,将秒转换为天,以便grep
进行分析。这可能有效(您应该测试):
(当然,还要加上1月16日的逻辑。)
这取决于shell算法只能处理整数这一事实。壳只是截断而不是圆化
更新
在对另一个答案的评论中,您阐明了自己的要求:
该命令应在1月16日开始执行,并在1月26日、2月5日、2月15日等日期继续执行–jai
为此,第二代方法可能是正确的方向
% date -v1m -v16d -v7H -v30M -v0S '+%s'
1452947400
(我在FreeBSD中,因此这些参数指向date
)
此表达式从当前时间中减去1月16日上午7:30(我的时区)的历元秒,并测试结果差是否可被10天整除。如果是,则表达式的计算结果为true,并运行yourcommand。请注意,$((0%$x))
对于$x的任何值计算为0
如果cron特别忙,无法在一秒钟内完成工作,那么这可能会出错
如果您想让它变得更复杂(甚至可能是如此复杂),我建议您将逻辑移到一个单独的shell脚本中,以处理日期比较数学。特别是如果你计划增加一个假因素,让工作错过1秒钟的时间。。这可能是多行脚本,很难在单个cronjob条目中维护。观察:cron的数学功能几乎不存在。Unix工具的数学功能是无穷的
结论:将问题从cron域转移到shell域
解决方案:每天使用crontab中的30 7***/path/to/script
运行此选项:
#!/bin/sh
PATH=$(/usr/bin/getconf PATH)
if test $(($(date +%j) % 10)) = 6; then
your_command
fi
这将测试一年中的某一天模10是否为6,就像1月16日一样(1月6日已经过去了…)
跳出框框思考:
修正你的需求。说服提出10天周期的人接受7天周期。这对cron来说容易多了。这是遵循接吻原则的。观察