除星期日外,每月第一天的 Cronjob

Ale*_*Kim 2 linux centos cron cronjob

我的 crontab 中有这样的条目:

0 0 1-2 * 1-6

它会在星期一到星期六的一个月的第一天或第二天的 00:00 运行是正确的吗?例如,如果第一天是星期天,那么它就不会运行它,对吗?但它会在每月的第 2 天运行 cronjob,因为它不是星期日。

jau*_*ume 5

如果一个月的第一天是星期日,它确实会运行。

原因是“月份中的某天”(第三个字段)和“星期几”(第五个字段)这两个条件不与 AND(两者都必须发生)连接,而是与 OR(必须存在一个)连接。来自man 5 crontab

注意:命令执行的日期可以由两个字段指定——月中的某天和一周中的某天。如果两个字段都受到限制(即不是 *),则当任一字段与当前时间匹配时,将运行该命令。例如,“30 4 1,15 * 5”将使命令在每个月的 1 号和 15 号以及每个星期五的凌晨 4:30 运行。

因此,您的 cronjob 将在每个月的第 1 天和第 2 天的午夜运行,另外每个月的周一、周二、周三、周四、周五和周六都会运行。

如果您只需要在一个月内而不是在星期日运行一次命令,正如您在评论中所写的那样,您必须检查命令本身中的日期。

这些是运行命令的条件:

IF (date is 1st day of month AND date is not Sunday) 
    OR (date is 2nd day of month AND yesterday was Sunday) 
THEN run command
Run Code Online (Sandbox Code Playgroud)

你可以写两个 cronjobs:

0 0 1 * * test $(date +\%u) -eq 7 || echo "today's the 1st day of the month but not Sun"
0 0 2 * * test $(date +\%u) -eq 1 && echo "today's Mon (=yesterday was Sun) and the 2nd day of the month"
Run Code Online (Sandbox Code Playgroud)

第一个 cronjob 将在每个月的第一天午夜运行:

  • date +%u返回一个整数,其中 1 是星期一,2 是星期二等('%' 需要在 crontab 中转义)。

  • test检查是否$(date +%u1)等于7(星期日)。

  • ||是 OR布尔运算符,它对上一个命令的返回值做出反应。如果test返回 FALSE,则运行命令的其余部分。

第二个 cronjob 将在每个月的第二天午夜运行:

  • 再次date +%u返回一个整数,其中 1 是星期一,2 是星期二,等等。

  • test检查是否$(date +%u1)等于1(星期一)。

  • &&是 AND布尔运算符,如果test返回 TRUE,则运行其余命令。