![如何在 crontab 中组合星期几和月份几?](https://linux22.com/image/532366/%E5%A6%82%E4%BD%95%E5%9C%A8%20crontab%20%E4%B8%AD%E7%BB%84%E5%90%88%E6%98%9F%E6%9C%9F%E5%87%A0%E5%92%8C%E6%9C%88%E4%BB%BD%E5%87%A0%EF%BC%9F.png)
我想在每月的第一天运行一些作业,在每周的第一天运行其他作业,但如果两者发生冲突怎么办?在这种情况下,月份应该优先。我该如何告诉这个 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
任何修改,而是在条目中放入类似的检查crontab
,script_week
如下所示:
59 12 * * 1 user if [ `/bin/date +\%d` != "01" ]; then script_week; fi
答案2
如果这是一项长期运行的作业,您还可以考虑让脚本使用锁定文件,以便每次只运行一个实例。然后,您可以将其列在两个 cron 条目中,并依靠它检测何时有一个实例已在运行。
如果这是一项运行时间非常长的作业,这也很有用。有时我遇到的 cron 作业通常不会花费很长时间,但如果系统在高负载下运行,处理日志或大型作业,则可能需要比预期更长的时间。然后,如果多个这样的作业同时启动,它们可能会开始堆积起来,最终导致机器瘫痪。
对于每周运行一次的作业来说,这不太可能,但养成这是一个很好的习惯——防止作业堆积,并且可以起到双重作用,防止作业从两个 crontab 条目中运行。