除每月第一天外,每天运行一次 cronjob

除每月第一天外,每天运行一次 cronjob

我试图:

  1. 在每月的第一天运行作业 A: 0 0 1 * *
  2. 在本月的其他日子运行作业 B:0 0 2-31 *?

Ubuntu 14.02 LTS 上的 Vixie cron 拒绝第二种语法,尽管根据维基百科和官方规格:

“crontab”,The Open Group 基础规范第 7 期 — IEEE Std 1003.1,2013 版,The Open Group,2013 年,检索日期:2015 年 5 月 18 日

根据上述参考,该语法0 0 2-31 * *将在每月的每一天运行该作业,因为第三和第五个字段被视为运行条件的 OR 子句。

答案1

您应该使用*,而不是?(这是无效的)。

?维基百科页面指出仅由 nnCron 使用的非标准扩展,您并未使用。

无论如何,如果将星期几设置为*并且指定了月份的日期,则将忽略星期几。您参考的 IEEE 1003.1 规范实际上说明了这一点,解释这些字段如何相互作用:

如果将月份或日期指定为元素或列表,但星期几为 <星号>,则月份和日期字段应指定匹配的日期。如果将月份和日期都指定为 <星号>,但星期几为元素或列表,则只有指定的星期几匹配。最后,如果将月份或日期指定为元素或列表,并且也将星期几指定为元素或列表,则应匹配与月份和日期或星期几匹配的任何日期。

因此正确的格式正是合乎逻辑的:

0 0 1 * * echo First of the month
0 0 2-31 * * echo Not the first of the month

答案2

您可以使用日期:

0 0 * * * [ $(date +\%d) -eq 1 ] && echo I will run on the 1st
0 0 * * * [ $(date +\%d) -ne 1 ] && echo I will run on all other days

答案3

如果您的 crond 不允许您指定不同的日期,请在脚本周围包装一个小的 shell 脚本。

#!/bin/bash
if [[ `date +%d` -eq 01  ]]
        then
                /path/to/script_a
        else
                /path/to/script_b
fi

每天运行该脚本并让它决定运行哪些脚本。

相关内容