我在 Alpine Linux 3.20 系统上的个人 crontab 中有一个时间表,每周二至周日(即除周一外的所有日子)的 00:10 运行:
10 0 * * 2-7 "$HOME/local/sbin/backup.sh" prune-daily
这似乎也会在周一触发。为什么?
请注意,我最初的报告将症状描述为“周日不运行”。我记错了发生了什么,抱歉。在更彻底地调查症状后,我已更正了症状描述。crontab 计划是正确的,因为它从一开始就是正确的。
我在 Alpine Linux 3.20 系统上的个人 crontab 中有一个时间表,每周二至周日(即除周一外的所有日子)的 00:10 运行:
10 0 * * 2-7 "$HOME/local/sbin/backup.sh" prune-daily
这似乎也会在周一触发。为什么?
请注意,我最初的报告将症状描述为“周日不运行”。我记错了发生了什么,抱歉。在更彻底地调查症状后,我已更正了症状描述。crontab 计划是正确的,因为它从一开始就是正确的。
熟悉的 Vixie Cron 守护程序使用整数 0 到 7 来指定星期几,从星期日到星期日(0 和 7 都表示星期日)。
2-7
因此,星期几字段中的计划将在星期二、星期三……和星期日运行。使用 7 来指定星期日是对POSIX 标准crontab
的扩展。如果启用,Alpine Linux 上的默认 Cron 守护进程不是Vixie Cron 守护进程,而是BusyBox 内置的最小实现。
BusyBox Cron 守护进程不使用整数 7 来表示星期日,而只允许使用 7 个整数来表示星期几,从 0 到 6,其中 0 表示星期日,这从其源代码中可以看出。
总之,crontab 计划需要修改为以下内容,以便除星期一外的所有日子都能运行:
或者,
当使用以 7 结尾的星期几范围时,每天都会触发计划,原因是代码中有一个循环,该循环试图确定应将具有范围规范的作业添加到星期几:
循环从范围的开始运行到结束,但使用
n1 = (n1 + 1) % modvalue
(其中n1
是星期几的数字,modvalue
是 7,代表七天)进行递增。由于不可能达到 7(它达到最大值 6,然后回到 0),因此它会触发“故障保护”,在 1024 次迭代后终止循环。到那时,作业已添加到一周中的所有日子(数组中的元素 0 到 6ary
已设置为 1)。由于代码将单日值(如
2
(星期二)和3,4
(两个单日,星期三和星期四))作为单值范围(分别为2-2
和)处理,因此星期几字段中的3-3,4-4
单个数字也会导致同样的问题。7