cron
cron是类 Unix 操作系统中按预设时间表自动执行任务的守护进程,通常以 crond 之名常驻后台,逐分钟检查是否存在到期任务并启动相应命令。任务规则写在称为 crontab 的配置文件中,用户通过 crontab 命令维护,系统管理员也可在 /etc/crontab 与 /etc/cron.d 等位置定义全局任务。它以简单、无需额外依赖的方式支撑日志轮转、数据备份、报表生成等周期性运维工作,是 Unix 环境下长期沿用的定时调度基础设施。
定义
cron 指一类长期运行在后台的调度程序,它在 Unix 及类 Unix 系统中按预先设定的时刻触发命令或脚本,与之配套的 crontab 文件则用来描述「何时执行什么」[1]。承担调度职责的进程通常称为 crond,任务的时间规则由分、时、日、月、星期等字段组合而成[2]。
它与一次性任务工具不同:cron 面向反复出现的周期任务,at 一类命令则负责在某个未来时刻执行一次[2]。在银河麒麟服务器操作系统的文档中,cron 与 anacron 被归为调度重复性任务的工具,二者都依据准确的时间点定义执行时机[2]。
原理
cron 守护进程以分钟为节拍循环,每一分钟读取已安装的任务表,判断当前时间是否与某条规则匹配,匹配则派生进程执行对应命令[3]。它对时间的比较是离散取值,规则中的每个字段给出允许的数值集合,只有全部字段都命中才会触发执行[4]。
用户级任务表每行由 5 个时间字段加一条命令组成,系统级任务表则多出一个指定执行用户的字段,字段之间以空格或制表符分隔,命令本身可以跨越多个字段[5]。例如 $0\ 0\ *\ *\ 1{-}5$ 表示周一至周五的零点各执行一次[4]。执行判定上,分、时、月三项必须吻合,而「日」与「星期」两项只要有一项吻合即可触发[5]。
字段内可用星号表示全部取值,用连字符表示闭区间,用逗号列出多个取值,用斜杠表示步长;月份与星期还允许写英文名称[5][4]。部分实现额外提供 @daily、@hourly、@reboot 等速记写法,@reboot 表示在系统启动时执行一次。
flowchart LR
A[crond 每 60 秒唤醒] --> B[读取 crontab 与 /etc/crontab]
B --> C{分/时/月/日/星期 是否全部命中}
C -- 否 --> A
C -- 是 --> D[以指定用户身份派生进程]
D --> E[执行命令,输出按 MAILTO 投递]
E --> A
发展历程
cron 的源头可追溯到第七版 Unix,此后在各类 Unix 系统上出现多种实现。目前流传最广的是保罗·维西(Paul Vixie)编写及其衍生的版本,另一支是马特·狄龙(Matt Dillon)的实现。
维西版 cron 的版本记录保存在其随附文档中:1.0 版完成于 1987 年 5 月 6 日,2.0 版完成于 1990 年 7 月 5 日,3.0 版完成于 1993 年 12 月 27 日。该实现以 System V 版 cron 的功能为蓝本,允许每个用户拥有独立的 crontab,文件集中存放在通常为 /var/cron/tabs 的受保护目录中。
该实现的致谢文档提到,@reboot 等速记符号源自他人提议,运行队列与任务来源标注也在后续版本中引入。GNU 的 mcron 在设计说明中指出,维西版 cron 约由 4500 行 C 代码构成,并成为兼容性参照的基准。
应用
cron 最常见的用途是周期性运维,例如日志清理、定时备份与数据同步;脚本语言生态也常借助它做外部节拍器,由 cron 按时唤起程序框架自带的调度器[6]。PHP 领域的常见做法是把业务逻辑写成命令行脚本,再由 crontab 规则在固定时刻调用,从而脱离 Web 请求的生命周期[6]。
在系统层面,大量软件包把任务片段放进 /etc/cron.d,或直接将可执行脚本放入 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 等目录,由系统按对应频率运行[7]。cron 的字段表达能力也被其他语言的调度库借用,不少框架以 5 段或 6 段表达式描述执行时刻[8]。
局限
cron 的最小时间粒度为 1 分钟,无法直接表达秒级或更精细的触发时刻[9]。它假定机器持续开机,若计划时刻系统处于关闭状态,该次任务不会补跑,也不会在重启后自动补偿[2]。
任务运行环境与交互式登录环境差别较大:默认 PATH 通常很短,且不会读取用户的 shell 配置文件,因此依赖环境变量或相对路径的脚本容易失败[7]。任务输出默认通过邮件发给任务表所有者,若系统未配置邮件则可能被直接丢弃,失败不易被察觉[7]。
此外,当前一次执行尚未结束时下一次触发仍会启动新实例,可能造成同一任务重叠运行,需借助文件锁等手段互斥[7]。cron 本身也不处理任务之间的依赖关系、资源限额与优先级,缺少分布式协调与内置监控能力[9]。针对这些不足,anacron 用「周期内是否已执行」的记录方式弥补关机漏跑,systemd 定时器则提供更细的精度与 Persistent 补跑选项[9][10]。
参见
参考资料
- crontab(5) [引用日期2026-10-29]
- 任务,也被称为工作,可以通过配置,在一个指定的日期,在一个指定的时间周期内,或者当系统的平均负载低于0.8时,自动地运行 [引用日期2026-10-29]
- 30-cron-timer [引用日期2026-10-29]
- Schedule Recurring Tasks [引用日期2026-10-29]
- crontab(5) - Updated: 2025/Dec/31 [引用日期2026-10-29]
- PHP中执行定时计划任务的几种常见方法 [引用日期2026-10-29]
- cron-and-scheduled-tasks [引用日期2026-10-29]
- Sparkdo.CrontabQ - NuGet Package Security Analysis [引用日期2026-10-29]
- Linux下Cron替代方案Systemd Anacron at对比与实践-开发者社区-阿里云 [引用日期2026-10-29]
- archlinux.org 上的网页 [引用日期2026-10-29]