我试图:
Ubuntu 14.02 LTS上的Vixie cron拒绝第二种语法,不过根据维基百科和官方规格,它似乎是有效的:
“crontab”,Open Group基本规范第7期 – IEEE标准1003.1,2013年版,The Open Group,2013,2015年5月18日检索
根据上面的参考文献,语法0 0 2-31 * *将在每个月的每一天运行作业,因为第三和第五个字段被视为运行条件的OR子句。
你应该使用* ,而不是? (这是无效的)。
维基百科页面指出, 是仅由nnCron使用的非标准扩展 ,您不使用它。
在任何情况下,如果星期几设置为*并指定了月份中的某一天,则忽略星期几。 您引用的IEEE 1003.1规范实际上阐述了这一点 ,解释了这些字段如何交互:
如果将月份或月份中的某一天指定为元素或列表,但星期几为<星号>,月份和月份date字段将指定匹配的date。 如果将月份和月份中的某一天指定为<星号>,但是星期几是元素或列表,则只有一周中的指定天数匹配。 最后,如果将月份或月份中的某一天指定为元素或列表,并且将星期几也指定为元素或列表,则任何一天匹配月份的月份或星期几,应匹配。
所以正确的格式是正确的:
0 0 1 * * echo First of the month 0 0 2-31 * * echo Not the first of the month
你可以使用date:
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
如果您的crond不允许您指定不同的date,请在脚本中包装一个小型shell脚本。
#!/bin/bash if [[ `date +%d` -eq 01 ]] then /path/to/script_a else /path/to/script_b fi
每天运行脚本,让它决定运行哪个脚本。