Cron 完全指南 | AI生成和翻译
Cron 是类 Unix 操作系统中一个强大的基于时间的任务调度器,允许用户自动在指定时间或间隔运行命令或脚本。以下是一份完整指南,帮助您理解并高效使用 cron。
什么是 Cron?
Cron 是一个守护进程(后台服务),用于执行预定命令。它通过读取名为 “crontabs”(cron 时间表)的配置文件来确定何时运行特定命令。Cron 非常适合用于:
- 常规系统维护
- 自动化备份
- 周期性数据处理调度
- 在特定时间运行脚本
- 任何需要定期运行而无需手动干预的任务
Cron 组件
Crontab 文件
Crontab(cron 时间表)是一个配置文件,用于指定周期性运行的 shell 命令。每个用户都可以拥有自己的 crontab,同时还有一个系统级的 crontab。
编辑个人 crontab:
crontab -e
查看当前 crontab:
crontab -l
删除 crontab:
crontab -r
Crontab 语法
crontab 文件中的每一行代表一个预定任务,遵循以下格式:
* * * * * 要执行的命令
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-6, 0=周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)
每个位置可以包含:
- 具体数字
- 范围(如
1-5) - 数值列表(如
1,3,5) - 星号(
*)表示”每” - 步长值(
*/n)表示”每 n 个”
五个时间/日期字段之后是要执行的命令。
常见 Cron 调度示例
常见 Cron 调度示例
基本时间间隔
| Cron 表达式 | 描述 | 示例 |
|---|---|---|
* * * * * |
每分钟运行 | * * * * * date >> /tmp/date_log.txt |
*/5 * * * * |
每 5 分钟运行 | */5 * * * * /scripts/check_server.sh |
0 * * * * |
每小时开始时运行 | 0 * * * * /scripts/hourly_backup.sh |
0 0 * * * |
每天午夜运行 | 0 0 * * * /scripts/daily_backup.sh |
0 0 * * 0 |
每周日午夜运行 | 0 0 * * 0 /scripts/weekly_maintenance.sh |
0 0 1 * * |
每月第一天午夜运行 | 0 0 1 * * /scripts/monthly_report.sh |
0 0 1 1 * |
每年 1 月 1 日午夜运行 | 0 0 1 1 * /scripts/yearly_cleanup.sh |
特定时间
| Cron 表达式 | 描述 | 示例 |
|---|---|---|
30 8 * * 1-5 |
工作日(周一至周五)上午 8:30 运行 | 30 8 * * 1-5 /scripts/workday_start.sh |
0 18 * * 1-5 |
工作日下午 6:00 运行 | 0 18 * * 1-5 /scripts/workday_end.sh |
0 9-17 * * * |
工作时间(上午 9 点至下午 5 点)每小时开始时运行 | 0 9-17 * * * /scripts/hourly_check.sh |
0 0,12 * * * |
午夜和中午运行 | 0 0,12 * * * /scripts/twice_daily.sh |
多重时间规范
| Cron 表达式 | 描述 | 示例 |
|---|---|---|
0 */4 * * * |
每 4 小时运行 | 0 */4 * * * /scripts/periodic_task.sh |
0 4,16 * * * |
上午 4:00 和下午 4:00 运行 | 0 4,16 * * * /scripts/twice_daily_at_4.sh |
15,45 * * * * |
每小时的第 15 和 45 分钟运行 | 15,45 * * * * /scripts/quarter_hourly.sh |
特殊时间规范
| Cron 表达式 | 描述 | 示例 |
|---|---|---|
@reboot |
启动时运行一次 | @reboot /scripts/startup_task.sh |
@yearly 或 @annually |
每年运行一次(等同于 0 0 1 1 *) |
@yearly /scripts/annual_task.sh |
@monthly |
每月运行一次(等同于 0 0 1 * *) |
@monthly /scripts/monthly_task.sh |
@weekly |
每周运行一次(等同于 0 0 * * 0) |
@weekly /scripts/weekly_task.sh |
@daily 或 @midnight |
每天运行一次(等同于 0 0 * * *) |
@daily /scripts/daily_task.sh |
@hourly |
每小时运行一次(等同于 0 * * * *) |
@hourly /scripts/hourly_task.sh |
复杂示例
| Cron 表达式 | 描述 | 示例 |
|---|---|---|
0 0 */2 * * |
每隔一天午夜运行 | 0 0 */2 * * /scripts/every_other_day.sh |
0 3 * * 1,3,5 |
周一、周三和周五凌晨 3:00 运行 | 0 3 * * 1,3,5 /scripts/mwf_task.sh |
30 23 * * 2,4 |
周二和周四晚上 11:30 运行 | 30 23 * * 2,4 /scripts/tue_thu_night.sh |
45 11 1-7 * * |
每月第一周上午 11:45 运行 | 45 11 1-7 * * /scripts/first_week_task.sh |
0 20 * 10,11,12 * |
10 月、11 月和 12 月晚上 8:00 运行 | 0 20 * 10,11,12 * /scripts/q4_evening_task.sh |
0 9-17/2 * * 1-5 |
工作日工作时间每隔两小时运行 | 0 9-17/2 * * 1-5 /scripts/biweekly_workday.sh |
特殊 Cron 字符串
Cron 还支持几个特殊字符串用于常见时间规范:
@reboot:启动时运行一次@yearly或@annually:每年运行一次(等同于0 0 1 1 *)@monthly:每月运行一次(等同于0 0 1 * *)@weekly:每周运行一次(等同于0 0 * * 0)@daily或@midnight:每天运行一次(等同于0 0 * * *)@hourly:每小时运行一次(等同于0 * * * *)
处理输出和错误
默认情况下,cron 通过电子邮件将命令输出发送给 crontab 的所有者。您可以将输出重定向到文件或丢弃:
# 将输出追加到日志文件
30 5 * * * /path/to/script.sh >> /path/to/logfile.log 2>&1
# 丢弃所有输出
0 12 * * * /path/to/script.sh > /dev/null 2>&1
Cron 中的环境变量
Cron 作业在最小化环境中运行,这可能导致脚本失败。您可以在 crontab 文件中设置变量:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
MAILTO=your-email@example.com
# 作业现在将使用这些环境变量
0 5 * * * /path/to/script.sh
Cron 安全考虑
- 对所有命令和脚本使用绝对路径
- 限制 crontab 文件权限
- 设置 cron 作业时遵循最小权限原则
- 记录和监控 cron 作业输出以便调试
- 考虑为敏感的 cron 作业使用专用用户
排查 Cron 作业问题
Cron 作业常见问题包括:
- 作业不运行:检查权限和路径
- 时间问题:验证时间格式是否正确
- 环境问题:确保设置了必要的变量
- 脚本错误:首先手动测试脚本
检查系统日志中的 cron 相关消息:
grep CRON /var/log/syslog
Cron 替代方案
虽然 cron 很普遍,但也有替代方案:
- Anacron:更适合非 24/7 运行的系统
- Systemd Timers:基于 systemd 系统的现代替代方案
- Fcron:具有类似 anacron 功能的增强型 cron
- Schedule:常用于 Web 应用程序的高级作业调度器
高级 Cron 用法
以不同用户身份运行作业
编辑其他用户的 crontab(需要 root 权限):
sudo crontab -u username -e
系统级 Crontabs
系统级 cron 作业可以添加到:
/etc/crontab/etc/cron.d/中的文件/etc/cron.daily/、/etc/cron.hourly/等目录
系统 crontab 的语法包含一个额外的用户字段:
* * * * * user command-to-execute
使用特定环境运行 Cron 作业
创建包装脚本来在运行实际命令之前设置环境:
#!/bin/bash
source /home/user/.profile
cd /path/to/working/directory
/path/to/actual/command
然后从 cron 调用此包装脚本。
Cron 作业最佳实践
- 记录 cron 作业:添加注释说明每个作业的作用
- 使用描述性脚本名称:便于维护
- 记录输出:保存作业输出以便排查问题
- 监控作业执行:为关键作业实施监控
- 优雅处理失败:在脚本中添加错误处理
- 使用锁文件:当作业执行时间超出预期时防止重叠执行
- 考虑时区:注意系统时区设置
遵循本指南,您应该能够在类 Unix 系统上有效设置、管理和排查 cron 作业。