Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从1月16日开始,每10天设置一个cron_Linux_Unix_Cron_Crontab_Cron Task - Fatal编程技术网

Linux 从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,

如何设置从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, 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来说容易多了。这是遵循接吻原则的。

观察