cron

义项:定时任务调度程序
cron

cron是类 Unix 操作系统中按预设时间表自动执行任务的守护进程,通常以 crond 之名常驻后台,逐分钟检查是否存在到期任务并启动相应命令。任务规则写在称为 crontab 的配置文件中,用户通过 crontab 命令维护,系统管理员也可在 /etc/crontab 与 /etc/cron.d 等位置定义全局任务。它以简单、无需额外依赖的方式支撑日志轮转、数据备份、报表生成等周期性运维工作,是 Unix 环境下长期沿用的定时调度基础设施。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

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 —— 存放 cron 调度规则的任务表文件及其管理命令

  • anacron —— 针对不常开机环境补跑周期任务的调度工具

  • systemd —— 现代 Linux 发行版中提供定时器单元以替代 cron 的初始化系统

  • 守护进程 —— cron 常驻后台运行所采用的进程形态

  • at 命令 —— 与 cron 相对、用于安排一次性任务的工具

词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:47:06Z

历史版本

本条目引用的词条
crontab anacron systemd 守护进程 at 命令