除了每月的第一天,每天运行一个 cronjob

Mar*_*ala 4 ubuntu cron

我试图:

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

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

“crontab”,The Open Group Base Specifications Issue 7 — IEEE Std 1003.1,2013 版,The Open Group,2013,检索于 2015 年 5 月 18 日

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

Mic*_*ton 13

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

维基百科页面指出,这?是一个仅由 nnCron 使用非标准扩展,您没有使用。

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

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

所以正确的格式正是合乎逻辑的:

0 0 1 * * echo First of the month
0 0 2-31 * * echo Not the first of the month
Run Code Online (Sandbox Code Playgroud)


par*_*ark 5

您可以使用日期:

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
Run Code Online (Sandbox Code Playgroud)

  • 您需要转义 % 否则它将被视为换行符。 (2认同)