cron 定时任务语法与排查速查
常用写法
crontab -l
crontab -e
crontab -u deploy -l
crontab -r
0 3 * * * /opt/app/backup.sh >> /var/log/backup.log 2>&1
*/5 * * * * /opt/app/check.sh
0 */2 * * * /opt/app/sync.sh
0 9 * * 1-5 /opt/app/report.sh
0 0 1 * * /opt/app/monthly.sh
30 2 * * 0 /opt/app/weekly.sh
@daily /opt/app/cleanup.sh
@reboot /opt/app/warmup.sh
CRON_TZ=Asia/Shanghai
0 4 * * * /opt/app/job.sh
场景速查
| 目的 |
写法/命令 |
注意 |
| 每分钟 |
* * * * * |
避免高频任务重叠 |
| 每 5 分钟 |
*/5 * * * * |
从 0 分开始 |
| 每小时 |
0 * * * * |
整点触发 |
| 每天 3 点 |
0 3 * * * |
受系统时区影响 |
| 工作日 9 点 |
0 9 * * 1-5 |
周字段 0 和 7 都表示周日 |
| 每月 1 日 |
0 0 1 * * |
日与周同时限制是“或” |
| 每 2 小时 |
0 */2 * * * |
分钟位置仍是 0 |
| 六段语法 |
0 0 3 * * * |
秒在最前,仅 Quartz 等支持 |
| 查看时区 |
timedatectl |
调度按系统时区计算 |
| 查看日志 |
journalctl -u cron -f |
RHEL 系服务名为 crond |
| 保留输出 |
>> /var/log/job.log 2>&1 |
默认可能只发邮件 |
| 防止重叠 |
flock -n /tmp/job.lock cmd |
拿不到锁立即退出 |
易错点
- 错误:把六段
0 0 3 * * * 写进系统 crontab;正确:系统 cron 只有五段(分 时 日 月 周)。
- 错误:命令里直接写
date +%F;正确:crontab 中 % 有特殊含义,要写成 date +\%F。
- 错误:日字段和周字段都写限制,以为是“且”;正确:两者是“或”关系,只保留一个限制。
- 错误:依赖登录 shell 的 PATH 和别名;正确:用绝对路径,或在 crontab 顶部显式设置
PATH=...。
- 错误:任务不重定向输出;正确:加
>> log 2>&1,否则输出可能进邮件或丢失。
- 错误:任务执行时间超过间隔导致重叠;正确:用
flock -n 或应用内锁。
- 错误:以为
CRON_TZ 所有实现都支持;正确:只有部分实现(如 cronie)支持,否则调整系统时区。
- 错误:用
TZ=Asia/Shanghai 控制触发时刻;正确:它只影响命令进程环境,调度仍按 cron 的时区。
- 错误:用
crontab -r 删除单条任务;正确:-r 删除整个 crontab,删单条用 crontab -e。
- 错误:脚本没有执行权限或 shebang 错误;正确:
chmod +x,并在首行写正确的解释器路径。
相关命令
读完自测
*/5 * * * * 表示什么?
- 为什么同时限制日字段和周字段会得到意外结果?
- 如何避免同一任务重叠执行?
答案
- 每 5 分钟执行一次,即分钟为 0、5、10……55。
- 日与周是“或”关系,任一条件满足就会触发。
- 用
flock -n 加锁,或在应用内实现互斥。