如何在crontab中结合星期几和星期几?

我想在每个月的第一天和其他人每周的第一天做一些工作,但是如果两者相互碰撞呢? 在这种情况下,该月份应该优先。 我如何告诉这个cron

# run on every day 1 of each month: 59 12 1 * * user script_month # run on every day 1 of each week: 59 12 * * 1 user script_week 

编辑1

有一个答案使用“IF”这是一个很好的解决方法。

那这个呢:

 # run on every day 1 of each week: 59 12 2-31 * 1 user script_week 

也许这也是我所要求的? (第一天的所有星期运行,除非是第一天的第一天)

编辑2:

我find了这个:

“如果两个[date]字段都受限制(即不是*),则当任一字段与当前时间匹配时,将运行该命令。 (来源: http : //thewatertower.org.uk/news/000160/crontab_the_first_five_fields_combine_to_restrict_the_schedule_except_for_when_they_dont.html )

似乎不可能像我在编辑1中写的?

script_week检查是否在本月的第一天运行。 如果是这样,那么在做任何真正的工作之前先退出。 例如,在bash脚本中,这样的检查可能如下所示:

 if [ `/bin/date +%d` = "01" ]; then exit 0; fi 

如果你愿意的话,可以不修改script_week ,而是在script_weekcrontab条目中script_week类似的检查,如下所示:

 59 12 * * 1 user if [ `/bin/date +\%d` != "01" ]; then script_week; fi 

如果是长时间运行的作业,则还可以考虑让脚本使用locking文件,以便一次只运行一个实例。 然后你可以把它列在两个cron条目中,并且依靠它来检测什么时候已经在运行。

如果这是一个非常长的工作,这也可以是有用的。 有时候我已经运行了通常不需要很长时间的cron作业,但是如果系统在高负载处理日志或大型作业下运行,则可能需要比预期更长的时间。 然后,如果多个作业同时开始,他们可以开始叠加,并最终使机器的膝盖。

对于每周运行一次的工作来说,这不太可能,但这是一个很好的习惯 – 防止堆积起来的工作,并且双重责任是防止从两个crontab条目运行作业。