如何配置Cron实现每隔一个周六自动执行脚本?
每隔一个周六执行Cron定时任务的最优实现方案
你之前使用的
10 22 1-7,15-21,29-31 * 6规则存在明显缺陷:部分月份的周六分布不符合这个日期范围规则,会出现多执行、漏执行的情况,且每年需要根据日历调整规则,维护成本极高。
以下是两种经过验证的稳定实现方案:
方案1:Cron定时+周数判断组合(全平台兼容)
这个方案兼容所有类Unix系统的原生Cron实现,无需额外依赖:
- 首先基础Cron规则先设置为每周六固定触发,保留你需要的22点10分的执行时间
- 再追加周数判断逻辑,只有匹配到奇偶周规则时才真正执行目标脚本
如果你需要双周周六执行,完整Cron规则如下:
如果你需要单周周六执行,把10 22 * * 6 [ $((\$(date +\%W) \% 2)) -eq 0 ] && /path/to/your/script.sh-eq 0修改为-eq 1即可。
注意:Cron配置中的%必须加\转义,否则会被Cron识别为换行符导致执行失败 - 参数说明:
date +%W表示取当年的周数(每周从周一开始计算),如果你习惯以周日作为一周起始,可以替换为%U参数。 - 跨年兼容优化:如果不想受每年年初周数重置的影响,可以改用天数取模的判断逻辑,只要首次触发是周六,之后就会永久每隔14天(一个双周周期)执行:
10 22 * * 6 [ $(((\$(date +\%s) / 86400) \% 14)) -eq 0 ] && /path/to/your/script.sh
方案2:Systemd Timer(适用于带Systemd的Linux发行版)
如果你的服务器使用Systemd管理服务,可以直接用Timer单元实现,不需要处理Cron转义逻辑,规则更直观:
- 新建服务单元
/etc/systemd/system/biweekly-sat.service,定义要执行的脚本:
[Unit] Description=Run custom scripts every other Saturday [Service] Type=oneshot ExecStart=/path/to/your/script.sh
- 新建对应的定时器单元
/etc/systemd/system/biweekly-sat.timer:
[Unit] Description=Biweekly Saturday execution timer [Timer] OnCalendar=Sat *-*-* 22:10:00 Persistent=true AccuracySec=1s OnUnitActiveSec=2w [Install] WantedBy=timers.target
- 加载配置并启动定时器:
systemctl daemon-reload systemctl enable --now biweekly-sat.timer
该方案会从定时器启动的时间开始,严格每两周的周六触发一次任务。
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

