crontab通过第五字段(0–7,0/7为周日)实现按星期执行,格式为“分 时 日 月 周 命令”,日与周字段为“或”关系;如每周三9:00执行:0 9 3 /path/script.sh。

在 Linux 中,crontab 本身不支持“每周几”这种自然语言描述(比如“每周三上午9点”),但它通过 第五个字段(星期几) 支持数字表示的星期(0–7,其中 0 和 7 都代表周日),配合其他字段就能精准实现“每周指定日期执行任务”。
理解星期字段:0–7 表示周日到周六
crontab 时间格式为:
分 时 日 月 周 命令
其中“周”字段取值范围是 0–7(0 和 7 都是周日),1=周一,2=周二……6=周六。注意:这个字段和“日”字段(第三位)是“或”的关系,不是“且” —— 即只要满足其中任一条件就会触发(除非你刻意规避冲突)。所以要实现“每周三上午9点”,应确保“日”字段不干扰,通常设为 *。
- 每周三 9:00 执行:
0 9 * * 3 /path/to/script.sh - 每周日和周五 22:30 执行:
30 22 * * 0,5 /path/to/backup.sh - 每周一至周五工作日 8:00 执行:
0 8 * * 1-5 /path/to/daily-check.sh
避免“日 + 周”同时匹配导致重复执行
默认情况下,如果某天既满足“日”字段(如 15 号),又满足“周”字段(如那天正好是周三),该任务会运行两次。这不是 bug,是 crontab 的设计逻辑。若你只希望按“星期几”执行(忽略具体几号),请将“日”字段设为 *,而不是留空或写成 ?(crontab 不支持 ?)。
- ✅ 正确(仅按星期三执行):
0 10 * * 3 /script.sh - ❌ 错误(可能每月 3 号 + 每周三都执行):
0 10 3 * * /script.sh(这是每月 3 号,不是周三) - ⚠️ 危险(每月 3 号且那天是周三才执行?不,实际是“3 号 或 周三”):
0 10 3 * 3 /script.sh→ 每月 3 号、以及每个周三都会运行
设置与验证步骤
使用 crontab -e 编辑当前用户的定时任务,保存后自动生效。推荐用绝对路径写命令,并重定向输出便于排查:
- 编辑任务:
crontab -e - 添加一行(例如每周四凌晨 2:15 执行日志清理):
15 2 * * 4 /usr/bin/find /tmp -name "*.log" -mtime +7 -delete > /dev/null 2>&1 - 查看当前任务:
crontab -l - 检查系统 cron 是否运行:
systemctl status cron(Debian/Ubuntu)或systemctl status crond(RHEL/CentOS) - 日志通常在
/var/log/syslog或/var/log/cron,可用grep CRON /var/log/syslog查看最近调度记录
进阶提示:跨用户与环境变量问题
root 用户的任务可直接用 sudo crontab -e;不同用户 crontab 独立。注意:crontab 默认 shell 环境极简,PATH 很短(常不含 /usr/local/bin),建议在脚本中显式声明 PATH,或用绝对路径调用命令。
- 在 crontab 开头加环境变量(推荐):
PATH=/usr/local/bin:/usr/bin:/bin - 或把命令封装成脚本,在脚本第一行写
#!/bin/bash,并在脚本内设置完整 PATH 和所需变量 - 测试时可先用
date; echo "test" >> /tmp/cron-test.log快速验证语法和触发逻辑


















