语法
Crontab 格式
# ┌───── minute (0-59) # │ ┌───── hour (0-23) # │ │ ┌───── day of month (1-31) # │ │ │ ┌───── month (1-12) # │ │ │ │ ┌───── day of week (0-7, 0&7=Sun) # * * * * * command
字段取值
*任意值(通配符)
,值列表:1,3,5
-范围:1-5
/步长:*/10(每 10 次)
0-59分钟范围
0-23小时范围
1-31日期范围
1-12月份范围(或 JAN-DEC)
0-7星期(0&7=周日,或 SUN-SAT)
特殊字符串
简写调度
@reboot启动时运行一次
@yearly0 0 1 1 * — 每年一次(1 月 1 日)
@monthly0 0 1 * * — 每月一次(1 日)
@weekly0 0 * * 0 — 每周一次(周日)
@daily0 0 * * * — 每天一次(午夜)
@hourly0 * * * * — 每小时一次
示例
常用调度
30 2 * * * /usr/local/bin/backup.sh 0 9 * * 1-5 /opt/report.sh */15 * * * * /usr/bin/health-check.sh 0 0 1 * * /opt/monthly-cleanup.sh 0 8,17 * * * /opt/notify.sh
调度说明
30 2 * * *每天凌晨 2:30
0 9 * * 1-5工作日上午 9:00
*/15 * * * *每 15 分钟
0 0 1 * *每月 1 日午夜
0 8,17 * * *每天 8:00 和 17:00
环境变量
设置变量
SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin [email protected] HOME=/home/deploy * * * * * /opt/myjob.sh
环境变量说明
SHELL运行命令的 shell(默认 /bin/sh
PATH搜索路径(cron 默认路径很少)
MAILTO输出发送到此邮件(空 = 不发邮件)
HOMEcron 任务的主目录
日志
输出与日志
# redirect stdout + stderr to a log file */5 * * * * /opt/job.sh >> /var/log/job.log 2>&1 # discard all output 0 3 * * * /opt/job.sh > /dev/null 2>&1 # log only errors 0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
查看 Cron 日志
# Debian / Ubuntu (syslog) grep CRON /var/log/syslog # RHEL / CentOS cat /var/log/cron # journalctl (systemd) journalctl -u cron --since "1 hour ago"
常用调度
日常模式
0 * * * *每小时整点
*/5 * * * *每 5 分钟
*/30 * * * *每 30 分钟
0 0 * * *每天午夜
0 6 * * 1每周一上午 6:00
0 0 1,15 * *每月 1 日和 15 日
0 0 * * 5每周五午夜
0 0 1 1 *每年 1 月 1 日
crontab 命令
管理 crontab
crontab -e # edit your crontab crontab -l # list your crontab crontab -r # remove your crontab crontab -u alice -l # list another user's (root) crontab /path/to/file # install crontab from file
系统 crontab 位置
/etc/crontab系统全局 crontab(含用户字段)
/etc/cron.d/独立 cron 文件目录
/etc/cron.daily/每日运行的脚本
/etc/cron.hourly/每小时运行的脚本
/etc/cron.weekly/每周运行的脚本
/etc/cron.monthly/每月运行的脚本
/var/spool/cron/用户 crontab 存储
技巧
最佳实践
使用绝对路径cron PATH 很少,始终使用完整路径
重定向输出> /dev/null 2>&1 避免邮件泛滥
锁文件flock 防止并发执行
先手动测试调度前先手动运行命令
使用 MAILTO设置 MAILTO="" 抑制所有邮件
检查时区cron 使用系统时间,用 date 确认
用 flock 防止并发
# only run if not already running * * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh