我试图:
- 在每月的第一天运行作业 A: 0 0 1 * *
- 在本月的其他日子运行作业 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
每天运行该脚本并让它决定运行哪些脚本。