cronjobs:运行 每天 "except" 当 weekly/monthly/yearly 是 运行

cronjobs: Run every day "except" when weekly/monthly/yearly is running

我目前总是 运行 6 点。曾经.

0 6 * * 1-6 server.sh backup  daily  # Run Monday-Saturday
0 6 * * 0 server.sh backup weekly    # Run every Sunday

而且由于时间的流逝,它们有时会发生碰撞:

0 6 1 2-12 * server.sh backup  monthly # Run 1st day of month (feb-dec)
0 6 1 1 *  server.sh backup   yearly # Run 1st of January

我之前已经改变了 weekly/monthly/yearly 的时间,这样他们就不会同时 运行。 我希望 cronjob 有一种简单的方法可以每天 6 点 运行 并每天整理/weekly/monthly/yearly

年应该出现在月、周和日、月出现在周和日之上。

对于每日和每周作业,您可以检查该月的第几天是否为 1,如果不是则仅 运行:

0 6 * * 1-6 [ "$(date '+%%-d')" -ne 1 ] && server.sh backup daily   # Run Monday-Saturday
0 6 * * 0   [ "$(date '+%%-d')" -ne 1 ] && server.sh backup weekly  # Run every Sunday

格式化指令 +%%-d 是 "day of month, without zero padding"。

%% 必须加倍,否则 cron 会将其解释为换行符。

某些版本的 date 不支持 - 删除零填充,这里并不需要,因为 [ 01 -eq 1 ] 是真的(但是 [ 01 = 1 ] 不是!),但它更干净。