cron 如何在指定的日期和时间运行任务?
cron 指定日期时间的写法:五字段分别对应分/时/日/月/星期;一次性任务用 at 更合适;附 30 个常用表达式速查、字段语法表与 FAQ。
crontab 五个时间字段依次是"分 时 日 月 星期",把对应字段填成具体数字就是在指定日期时间运行。 例如 3 月 15 日上午 9:30 执行:
30 9 15 3 * /path/to/command
字段语法总览
┌─────────── 分钟 (0-59)
│ ┌───────── 小时 (0-23)
│ │ ┌─────── 日 (1-31)
│ │ │ ┌───── 月 (1-12,或 jan-dec)
│ │ │ │ ┌─── 星期 (0-6 或 sun-sat,0/7=周日)
│ │ │ │ │
* * * * * 命令
每个字段支持四种写法:
| 写法 | 含义 | 示例 |
|---|---|---|
* |
任意值 | 每分钟/每天…… |
| 数字 | 具体值 | 30 = 第 30 分 |
a-b |
范围 | 9-17 = 9 到 17 点 |
a,b,c |
枚举 | 1,15 = 1 号和 15 号 |
*/n |
步长 | */10 = 每隔 10 |
常用示例速查
30 9 15 3 * # 每年 3 月 15 日 9:30
0 22 * * 1-5 # 工作日 22:00
0 0 1 * * # 每月 1 号零点
15 14 1 * * # 每月 1 号 14:15
0 8 * * 1,3,5 # 每周一三五早 8 点
编辑入口
crontab -e # 编辑当前用户的 crontab
crontab -l # 查看现有任务
系统级任务编辑 /etc/crontab(格式多一列用户名)。
一次性任务请用 at
cron 是为"周期性"设计的。 只跑一次的任务("明天下午 3 点发版")用 at 更贴切:
echo '/opt/deploy/release.sh' | at 15:00 tomorrow
at -l # 查看队列
用 cron 干一次性活儿的隐患:任务执行后忘了删规则,明年同一天它又跑了。
观测云对照
任务排期越精确,漏跑的代价往往越大(发版、对账、报表)。把任务输出统一采集到观测云,给关键任务配"预期窗口无日志即告警"的监控器——无论是 cron 没触发、时区搞错还是脚本报错,都能第一时间感知,而不是等业务方来问。
常见问题(FAQ)
Q:日期和星期同时填了会怎样?
A:这是经典坑——两者是"或"的关系!0 0 13 * 5 表示"13 号或周五"都执行,不是"13 号恰逢周五"。
Q:能指定到秒吗?
A:不能,cron 最小粒度是分钟。秒级需求用 systemd timer 或脚本内 sleep 循环。
Q:cron 用的是哪个时区?
A:系统本地时区。部分实现支持在 crontab 里写 CRON_TZ=Asia/Shanghai 覆盖,容器环境尤其建议显式指定。