我想知道是否有人可以帮助解决与 Cron 作业相关的简单但有时令人困惑的命令。
我希望 cron 作业每月在星期六@12am 运行两次。
答案1
不幸的是,你想要的是不可能的。“每月两次星期六”的时间表不能用定时任务。您可以说“每月两次”,也可以说“星期六”,但您不能使用 AND 链接这些条件。它们将始终使用 OR 链接。根据man 5 crontab
:
注意:命令执行的日期可以通过两个字段指定——月份日期和星期几。如果两个字段都受到限制(即不是 *),则当任一字段与当前时间匹配时,命令就会运行。例如,“30 4 1,15 * 5”将导致命令在每个月 1 日和 15 日的凌晨 4:30 运行,以及每个星期五运行。
但是,您可以使用 shell 表达式来帮助!
我发现这个建议在网站上:
0 0 * * Sun [ $(expr $(date +%W) % 2) -eq 1 ] && /path/to/command
让我们剖析一下它!
0 0 * * Sun
是 cron 计划。它每周日午夜运行。[ $(expr $(date +%W) % 2) -eq 1 ] && /path/to/command
是命令(就 cron 而言)[ $(expr $(date +%W) % 2) -eq 1 ]
如果年份中的周数为奇数,则成功返回expr $(date +%W) % 2
输出date +%W
(“一年中的周数,以星期一为一周的第一天(00..53)”,其他变体也可用)并应用模运算(除以二,返回余数)[ $something -eq 1 ]
测试是否$something
等于 1 并返回结果作为其退出代码
&& /path/to/command
表示如果前一个命令成功则运行该命令(即,如果周数是奇数)
使用这个表达式,你可以保持脚本不被修改,并且定时任务文件。
答案2
根据男人5 crontab
步长值可以与范围结合使用。在范围后面加上/<数字> 指定跳过数字的值的范围。例如,0-23/2可以在小时字段中使用,以指定每隔一小时执行一次命令(V7 标准中的替代方法是0,2,4,6,8,10,12,14,16,18,20,22)。星号后面也可以有步骤,因此,如果你想说每两个小时,只需使用*/2。
它是0 0 * */2 6 <other parts>
答案3
我认为
0 0 * */2 6
每隔一个月的每个星期六运行。
为了每月两次,必须
0 0 */15 * 6
干杯!