我有以下 Cron 规则:
0 8 1,2,3,4,5,6,7,14,15,16,17,18,19,20 * 2 /root/command.sh
我的目标是每两周的星期二运行 /root/command.sh。
Crontab大师返回以下内容:
每月 1、2、3、4、5、6、7、14、15、16、17、18、19 和 20 日以及星期二的 08:00。
周二
但由于某些原因,上述任务于今天(星期五)运行。
为了精确:
$> date
$> Fri Mar 3 10:04:21 UTC 2023
服务员正确地认为今天是星期五。
还
$> cat /etc/issue
$> Debian GNU/Linux 11
我怀疑给 Cron 的参数是不是不正确?
精确:如果您有更好的方法告诉 Cron“每两周的星期二运行一次”,我洗耳恭听!
答案1
规则cron
是每月运行几天或每周运行几天。因此,在您的情况下,将在每个星期二 + 每月 1、2、3、4、5、6、7、14、15、16、17、18、19、20 天运行。
要每两周运行一次,您应该将登录信息纳入脚本中,例如每月第一周和第三周运行。例如,在脚本的第一行中添加:
number=$(date +%W)
if [ $((number%2)) -eq 0 ]
then exit
else <run the command>
fi
并且cron
0 8 * * 2 command
这将在一年中的第 0、2、4 周等星期二运行脚本。但这意味着您可能会遇到脚本在一个月内运行 3 次的情况。如果您想在奇数周(1、3、5、....)运行,请将命令更改为then
和else
或编辑if
如下:
if [ $((number%2)) -eq 1 ]
答案2
我认为没有办法仅使用 cron 表达式来做到这一点。
通常的解决方案是使用运行于每逢星期二(0 8 * * 2
),然后检查里面的周数是偶数还是奇数/root/command.sh
。
PS. 一些 cron 实现支持TUE#2
在星期几字段中使用语法,并将其解释为“每月的第二个星期二”。对于这些,您可以尝试0 8 * * 2#1,2#3
。但 Vixie cron 不支持这一点。