📋 Cron 时间格式

* * * * * 命令
分 时 日 月 周 要执行的命令

分钟 (0-59)

每小时的第几分钟执行

小时 (0-23)

每天的第几小时执行

日期 (1-31)

每月的第几天执行

月份 (1-12)

每年的第几月执行

星期 (0-7)

每周的第几天执行
(0和7都表示周日)

🎯 特殊字符说明

  • * 表示任意值,匹配所有可能的值
  • , 表示列表,如 1,3,5 表示1点、3点、5点
  • - 表示范围,如 1-5 表示1到5
  • / 表示间隔,如 */5 表示每5个单位
  • ? 用于日期和星期字段,表示不指定值

⏰ 最常用的定时任务

🔄 每分钟执行

* * * * * /path/to/script.sh
每分钟都会执行一次,常用于测试

🕐 每小时执行

0 * * * * /path/to/script.sh
每小时的第0分钟执行,如 1:00, 2:00, 3:00

🌅 每天早上8点执行

0 8 * * * /path/to/script.sh
每天上午8:00执行,适合日常任务

🌙 每天深夜执行

0 2 * * * /path/to/backup.sh
每天凌晨2:00执行,适合备份任务

📅 每周一执行

0 9 * * 1 /path/to/weekly-report.sh
每周一上午9:00执行,适合周报生成

📆 每月1号执行

0 0 1 * * /path/to/monthly-task.sh
每月1号凌晨执行,适合月度任务

⚡ 每5分钟执行

*/5 * * * * /path/to/monitor.sh
每5分钟执行一次,适合监控脚本

🔄 每30分钟执行

*/30 * * * * /path/to/sync.sh
每30分钟执行一次,适合同步任务

🚀 高级定时配置

💼 工作日每小时执行

0 * * * 1-5 /path/to/workday-task.sh
周一到周五每小时执行,适合办公自动化

🎯 特定时间点执行

30 9,14,18 * * * /path/to/reminder.sh
每天9:30、14:30、18:30执行

📈 工作时间内每15分钟

*/15 9-17 * * 1-5 /path/to/status-check.sh
工作日9-17点每15分钟执行

🌸 季度任务

0 0 1 1,4,7,10 * /path/to/quarterly.sh
每季度第一天执行(1月、4月、7月、10月)

🎉 年度任务

0 0 1 1 * /path/to/yearly-cleanup.sh
每年1月1日执行年度清理

⏰ 复杂时间组合

15,45 */2 * * * /path/to/complex-task.sh
每2小时的第15分钟和45分钟执行

🔧 带输出重定向

0 2 * * * /path/to/backup.sh >> /var/log/backup.log 2>&1
执行备份并记录日志,包含错误信息

🌐 环境变量设置

0 3 * * * cd /app && /usr/bin/python3 script.py
切换到指定目录后执行Python脚本

💡 实际应用场景

📊 数据库备份

0 2 * * * mysqldump -u root -p database_name > /backup/db_$(date +\%Y\%m\%d).sql
每天凌晨2点备份MySQL数据库

🧹 日志清理

0 1 * * 0 find /var/log -name "*.log" -mtime +30 -delete
每周日凌晨1点删除30天前的日志文件

🔄 Git 自动同步

*/10 * * * * cd /path/to/repo && git pull origin main
每10分钟自动拉取Git仓库更新

📧 系统报告邮件

0 8 * * 1 df -h | mail -s "Weekly Disk Usage" admin@example.com
每周一发送磁盘使用情况邮件

🌡️ 系统监控

*/5 * * * * top -bn1 | grep "Cpu(s)" >> /var/log/cpu_usage.log
每5分钟记录CPU使用率

🔒 SSL证书检查

0 9 * * * openssl x509 -in /etc/ssl/cert.pem -noout -checkend 2592000
每天检查SSL证书是否即将过期

📱 API健康检查

*/2 * * * * curl -f http://localhost:8080/health || echo "API Down" | mail -s "Alert" admin@example.com
每2分钟检查API状态,异常时发邮件

🔄 Docker容器重启

0 4 * * * docker restart $(docker ps -q --filter "status=exited")
每天凌晨4点重启已停止的Docker容器

💎 专家技巧和最佳实践

📝 Cron管理命令

crontab -e # 编辑当前用户的crontab
crontab -l # 查看当前crontab
crontab -r # 删除当前crontab
基本的crontab管理命令

👤 用户级别管理

sudo crontab -u username -e # 编辑指定用户的crontab
sudo crontab -u username -l # 查看指定用户的crontab
管理其他用户的定时任务

📊 日志记录最佳实践

0 2 * * * /path/to/script.sh >> /var/log/cron_script.log 2>&1
将标准输出和错误都重定向到日志文件

🔧 环境变量设置

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 2 * * * /path/to/script.sh
在crontab中设置环境变量

⚠️ 防止任务重叠

0 * * * * flock -n /tmp/script.lock -c '/path/to/script.sh'
使用文件锁防止脚本重复执行

🔍 调试cron任务

# 检查cron服务状态
systemctl status cron
# 查看cron日志
tail -f /var/log/cron
调试定时任务的常用方法

📊 特殊时间表达式

@reboot /path/to/startup.sh # 系统启动时执行
@yearly /path/to/yearly.sh # 每年执行
@monthly /path/to/monthly.sh # 每月执行
@weekly /path/to/weekly.sh # 每周执行
@daily /path/to/daily.sh # 每天执行
@hourly /path/to/hourly.sh # 每小时执行
使用特殊字符串简化时间表达式

⚡ 性能优化建议

# 避免在系统繁忙时执行
5 2 * * * /path/to/heavy-task.sh
# 分散执行时间避免同时运行多个任务
7 3 * * * /path/to/task1.sh
13 3 * * * /path/to/task2.sh
合理安排任务执行时间