如何在 crontab 中组合星期几和月份几?

如何在 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:

我找到了这个:

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

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

答案1

检查script_week它是否在每月 1 日运行。如果是,则在执行任何实际工作之前让它退出。例如,在 bash 脚本中,这样的检查可能如下所示:

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

如果愿意,您可以不做script_week任何修改,而是在条目中放入类似的检查crontabscript_week如下所示:

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

答案2

如果这是一项长期运行的作业,您还可以考虑让脚本使用锁定文件,以便每次只运行一个实例。然后,您可以将其列在两个 cron 条目中,并依靠它检测何时有一个实例已在运行。

如果这是一项运行时间非常长的作业,这也很有用。有时我遇到的 cron 作业通常不会花费很长时间,但如果系统在高负载下运行,处理日志或大型作业,则可能需要比预期更长的时间。然后,如果多个这样的作业同时启动,它们可能会开始堆积起来,最终导致机器瘫痪。

对于每周运行一次的作业来说,这不太可能,但养成这是一个很好的习惯——防止作业堆积,并且可以起到双重作用,防止作业从两个 crontab 条目中运行。

相关内容