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
# cronie 支持 CRON_TZ,指定调度时区
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 拿不到锁立即退出

易错点

相关命令

读完自测

  1. */5 * * * * 表示什么?
  2. 为什么同时限制日字段和周字段会得到意外结果?
  3. 如何避免同一任务重叠执行?
答案
  1. 每 5 分钟执行一次,即分钟为 0、5、10……55。
  2. 日与周是“或”关系,任一条件满足就会触发。
  3. 用 flock -n 加锁,或在应用内实现互斥。