应该在星期二运行的 Cron 作业在其他日子运行吗?

应该在星期二运行的 Cron 作业在其他日子运行吗?

我有以下 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、....)运行,请将命令更改为thenelse或编辑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 不支持这一点。

相关内容