正在加载,请稍候…

Crontab 语法详解:像专家一样调度 Cron 任务

通过可视化生成器掌握 crontab 调度语法。学习如何为任何计划编写 cron 表达式。

Crontab 语法详解:像专家一样调度 Cron 任务

什么是 Cron 任务?

Cron 任务是一种在 Unix-like 操作系统上按指定时间间隔自动运行的定时任务。其名称源自希腊语“chronos”(时间)。Cron 是系统服务;crontab(cron table)是定义定时任务的文件。

Cron 用于:自动备份、数据库维护、发送定时邮件、生成报告、清理临时文件、更新缓存,以及任何无需人工干预的重复性任务。

Crontab 语法详解:像专家一样调度 Cron 任务 插图

Crontab 语法

一个 crontab 条目包含六个字段:

* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7,其中 0 和 7 表示星期日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)

特殊字符

字符 含义 示例
* 任意值(通配符) * * * * * 每分钟执行一次
, 值列表 1,15,30 表示在第 1、15、30 分钟
- 范围 9-17 表示上午 9 点到下午 5 点
/ 步长 */15 表示每 15 个单位

Crontab 语法详解:像专家一样调度 Cron 任务 插图

常见 Cron 调度示例

# 每分钟执行一次
* * * * * /path/to/script.sh

# 每小时的第 0 分钟执行
0 * * * * /path/to/script.sh

# 每天午夜执行
0 0 * * * /path/to/script.sh

# 每天凌晨 2:30 执行
30 2 * * * /path/to/script.sh

# 每周一上午 9 点执行
0 9 * * 1 /path/to/script.sh

# 每个工作日(周一至周五)下午 6 点执行
0 18 * * 1-5 /path/to/script.sh

# 每 15 分钟执行一次
*/15 * * * * /path/to/script.sh

# 每月第一天午夜执行
0 0 1 * * /path/to/script.sh

# 每周日凌晨 3 点执行(用于每周维护)
0 3 * * 0 /path/to/backup.sh

# 每天上午 8 点和晚上 8 点执行两次
0 8,20 * * * /path/to/script.sh

特殊预定义调度

大多数 cron 实现支持简写关键字:

关键字 等价表达式 描述
@reboot (无) 启动时执行一次
@yearly 0 0 1 1 * 每年一次(1 月 1 日午夜)
@annually 0 0 1 1 * 同 @yearly
@monthly 0 0 1 * * 每月一次(1 日午夜)
@weekly 0 0 * * 0 每周一次(周日午夜)
@daily 0 0 * * * 每天一次(午夜)
@midnight 0 0 * * * 同 @daily
@hourly 0 * * * * 每小时一次

Crontab 语法详解:像专家一样调度 Cron 任务 插图

管理 Crontab

# 查看当前用户的 crontab
crontab -l

# 编辑 crontab(使用默认编辑器)
crontab -e

# 删除当前用户的所有 cron 任务
crontab -r

# 编辑其他用户的 crontab(需要 root 权限)
sudo crontab -u username -e

# 列出其他用户的 crontab
sudo crontab -u username -l

Cron 环境与常见陷阱

Cron 任务在最小环境中运行——你在 shell 中依赖的 PATH、HOME 和其他变量可能不可用。

PATH 问题:指定可执行文件的完整路径:

# 错误——可能找不到 'python'
0 2 * * * python /opt/scripts/backup.py

# 正确——使用完整路径
0 2 * * * /usr/bin/python3 /opt/scripts/backup.py

输出重定向:默认情况下,cron 将输出通过邮件发送给系统用户。将输出重定向到日志文件:

0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

时区:Cron 使用系统时区。如果你的服务器使用 UTC,但希望任务在“本地”时间运行,请考虑时区偏移。

错过任务:如果服务器在任务应该运行时宕机,该任务会被跳过——服务器重启后不会补执行(除非使用 anacron)。

使用此工具

用通俗英语输入你想要的调度,或填写时间字段,工具将生成正确的 crontab 表达式。你也可以粘贴 crontab 表达式以查看人类可读的描述。

-> 试试 Crontab 生成器