Cron 完全指南 | AI生成和翻译

Home 2025.04

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)

每个位置可以包含:

五个时间/日期字段之后是要执行的命令。

常见 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 还支持几个特殊字符串用于常见时间规范:

处理输出和错误

默认情况下,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 安全考虑

  1. 对所有命令和脚本使用绝对路径
  2. 限制 crontab 文件权限
  3. 设置 cron 作业时遵循最小权限原则
  4. 记录和监控 cron 作业输出以便调试
  5. 考虑为敏感的 cron 作业使用专用用户

排查 Cron 作业问题

Cron 作业常见问题包括:

  1. 作业不运行:检查权限和路径
  2. 时间问题:验证时间格式是否正确
  3. 环境问题:确保设置了必要的变量
  4. 脚本错误:首先手动测试脚本

检查系统日志中的 cron 相关消息:

grep CRON /var/log/syslog

Cron 替代方案

虽然 cron 很普遍,但也有替代方案:

高级 Cron 用法

以不同用户身份运行作业

编辑其他用户的 crontab(需要 root 权限):

sudo crontab -u username -e

系统级 Crontabs

系统级 cron 作业可以添加到:

系统 crontab 的语法包含一个额外的用户字段:

* * * * * user command-to-execute

使用特定环境运行 Cron 作业

创建包装脚本来在运行实际命令之前设置环境:

#!/bin/bash
source /home/user/.profile
cd /path/to/working/directory
/path/to/actual/command

然后从 cron 调用此包装脚本。

Cron 作业最佳实践

  1. 记录 cron 作业:添加注释说明每个作业的作用
  2. 使用描述性脚本名称:便于维护
  3. 记录输出:保存作业输出以便排查问题
  4. 监控作业执行:为关键作业实施监控
  5. 优雅处理失败:在脚本中添加错误处理
  6. 使用锁文件:当作业执行时间超出预期时防止重叠执行
  7. 考虑时区:注意系统时区设置

遵循本指南,您应该能够在类 Unix 系统上有效设置、管理和排查 cron 作业。


Back Donate