cron - 用于执行计划任务的守护进程(Vixie Cron)
概要
cron [-f] [-l] [-L loglevel] [-n fqdn] [-x debugflags]
cron [-N]
描述
cron 由 systemd(1) 在进入多用户运行级别时直接调用。
选项
-f
以前台模式运行,不守护进程化。
-l
启用符合 LSB 标准的 /etc/cron.d 文件命名方式。但是,此设置不会影响对 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 或 /etc/cron.monthly 下的文件进行解析。
-n fqdn
在发送邮件时,将 FQDN 包含在主题中。默认情况下,cron 会缩写主机名。
-N
立即运行 cron 任务,然后退出。此选项对于执行测试很有用。
-L loglevel
告诉 cron 记录有关作业的信息(无论此值为多少,错误都将被记录),记录级别为以下值的总和:
1 将记录所有 cron 任务的开始
2 将记录所有 cron 任务的结束
4 将记录所有失败的任务(退出状态 != 0)
8 将记录所有 cron 任务的进程编号
默认情况下,将记录所有作业的开始(1)。如果将 loglevel 设置为零 (0),则将禁用记录。如果值为十五 (15),则将选择所有选项。
-x debugflags
告诉 cron 输出更多详细信息并输出调试信息;debugflags 是以下值的总和:
1 “ext”
2 “sch”
4 “proc”
8 “pars”
16 “load”
32 “misc”
64 “test”
128 “bit”
注意事项
cron 在其卷影区域 (/var/spool/cron/crontabs/) 中搜索 crontab 文件(这些文件以 /etc/passwd 中的帐户命名);找到的 crontab 会被加载到内存中。请注意,不应直接访问此目录中的 crontab - 应使用 [crontab]({filename}../../crontab)(1) 命令来访问和更新它们。
cron 还读取 /etc/crontab,该文件采用略有不同的格式(请参阅 crontab(5))。在 Debian 中,/etc/crontab 的内容预定义为在 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 中运行程序。此配置特定于 Debian,请参阅下面的 DEBIAN SPECIFIC 备注。
此外,在 Debian 中,cron 读取 /etc/cron.d 目录中的文件。cron 以与 /etc/crontab 文件相同的方式处理 /etc/cron.d 中的文件(它们遵循该文件的特殊格式,即它们包括用户字段)。但是,它们与 /etc/crontab 独立:例如,它们不会继承其中的环境变量设置。此更改特定于 Debian,请参阅下面的 DEBIAN SPECIFIC 备注。
与 /etc/crontab 类似,/etc/cron.d 目录中的文件会受到更改的监控。系统管理员可以在 /etc/cron.d/ 中创建 cron 任务,文件名为“local”或“local-foo”。
/etc/crontab 和 /etc/cron.d 中的文件必须由 root 用户拥有,并且不能具有组或其它用户的写入权限。 与 spool 区域不同,/etc/cron.d 或 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 中的文件也可以是符号链接,前提是符号链接及其指向的文件都由 root 用户拥有。 /etc/cron.d 中的文件不需要可执行,而 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 中的文件需要可执行,因为它们由 run-parts(有关更多信息,请参阅 run-parts(8))运行。
cron 每分钟都会唤醒,检查所有存储的 crontab,并检查每个命令以查看是否应在当前分钟运行。 在执行命令时,任何输出都会通过 crontab 的所有者(或者通过 crontab 中 MAILTO 环境变量中指定的用户,如果存在)发送给 crontab 的所有者(或者通过 crontab 中 MAILFROM 环境变量中指定的电子邮件地址,如果存在)。 运行这些进程的 cron 的子进程名称将被强制转换为大写,这将在 syslog 和 ps(1) 输出中看到。
此外,cron 每分钟都会检查其 spool 目录的 modtime(或 /etc/crontab 文件的 modtime),如果已更改,则 cron 会检查所有 crontab 上的 modtime,并重新加载已更改的 crontab。 因此,每次修改 crontab 文件时,无需重新启动 cron。 请注意,crontab(1) 命令会在更改 crontab 时更新 spool 目录的 modtime。
当时钟更改小于 3 小时时,例如在夏令时开始和结束时,存在特殊考虑。 如果时间向前移动,则在跳过的时间内应运行的作业将在更改后不久运行。 相反,如果时间向后移动小于 3 小时,则落入重复时间内的作业将不会重新运行。
只有在特定时间运行的作业(未指定为 @hourly,也不在小时或分钟说明符中使用 '*')会受到影响。 使用通配符指定的作业将基于新时间立即运行。
大于 3 小时的时钟更改被视为时钟的更正,并且立即使用新时间。
cron 将其操作记录到 syslog 设施 'cron' 中,并且可以使用标准的 syslogd(8) 设施来控制日志记录。
环境
如果 Debian 系统中在 /etc/default/cron 中配置,则可以使用 /etc/environment 或 /etc/default/locale 来管理 cron 守护程序的本地化设置环境,后者中的值将覆盖前者中的值。 这些文件将被读取,并将用于设置 LANG、LC_ALL 和 LC_CTYPE 环境变量。 这些变量随后用于设置邮件的字符集,默认值为 'C'。
这不会影响在 cron 下运行的任务的环境。有关如何修改任务环境的更多信息,请参阅 crontab(5)。
如果存在,守护进程将使用 /etc/localtime 中的定义来设置时区。
可以在用户的 crontab 定义中重新定义环境,但 cron 只能处理单个时区的任务。
Debian 特性
Debian 对 cron 引入了一些原始版本中没有的更改。最重要的更改包括:
- 通过 /etc/crontab 支持 /etc/cron.{hourly,daily,weekly,monthly},
- 支持 /etc/cron.d(用于软件包 crontab 的插件目录),
- PAM 支持,
- SELinux 支持,
- auditlog 支持,
- DST 和其他与时间相关的更改/修复,
- 使用 SGID crontab(1) 代替 SUID root,
- Debian 特定的文件位置和命令,
- Debian 特定的配置 (/etc/default/cron),
- 许多其他较小的功能和修复。
Debian 通过 /etc/crontab 文件的默认设置,提供对 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 的支持(请参阅 crontab(5) 中的系统范围示例)。默认的系统范围 crontab 包含四个任务:每小时、每天、每周和每月运行一次。这些任务将执行 run-parts(8),并将每个目录作为参数传递。如果安装了 anacron(8),这些任务将被禁用(除每小时任务外),以防止两个守护进程之间发生冲突。
如上所述,这些目录中的文件必须通过一些健全性检查,包括以下内容:可执行、由 root 拥有、不能被组或其他人写入,并且如果为符号链接,则必须指向由 root 拥有的文件。此外,文件名必须符合 run-parts(8) 的文件名要求:它们必须完全由字母和数字组成,并且只能包含特殊字符下划线 (_) 和连字符 (-)。任何不符合这些要求的文件将不会由 run-parts(8) 执行。例如,任何包含句点 (.) 的文件都将被忽略。这是为了防止 cron 运行 Debian 包管理系统在处理 /etc/cron.d/ 中的文件时作为配置文件(即以 .dpkg-dist、.dpkg-orig、.dpkg-old 和 .dpkg-new 结尾的文件)留下的任何文件。
此功能可用于系统管理员和软件包,以包含将在定义的间隔运行的任务。在这些目录中创建的软件包的文件应以提供它们的软件包的名称命名。
对 /etc/cron.d 的支持包含在 cron 守护进程本身中,该守护进程将此位置视为系统范围的 crontab 存储。此目录可以包含任何定义任务的文件,这些文件遵循 /etc/crontab 中使用的格式,即与用户 crontab 不同,这些文件必须在任务定义中提供运行任务的用户名。
此目录中的文件必须由 root 用户拥有,不需要可执行权限(它们是配置文件,就像 /etc/crontab 一样),并且必须符合与 run-parts(8) 中使用的命名约定相同的约定:它们只能包含大小写字母、数字、下划线和连字符。这意味着它们不能包含任何点。如果向 cron 传递了 -l 选项(此选项可以通过 /etc/default/cron 进行设置,如下所述),那么它们必须符合 LSB 命名空间规范,完全与 runparts(8) 中的 --lsbsysinit 选项相同。
此功能的预期用途是允许需要比 /etc/cron.{hourly,daily,weekly,monthly} 目录更精细的计划控制的软件包,将 crontab 文件添加到 /etc/cron.d。这些文件应以提供它们的软件包的名称命名。
此外,cron 的默认配置由 /etc/default/cron 控制,该文件由启动 cron 守护进程的 init.d 脚本读取。此文件确定 cron 是否会读取系统的环境变量,并允许在执行 cron 程序之前添加额外的选项,以配置其日志记录或定义它将如何处理 /etc/cron.d 下的文件。
参见
crontab(1), crontab(5), run-parts(8)
作者
Paul Vixie <_> 编写了此 man 手册(1994 年)。
Steve Greenland <_> 维护此软件包(1996-2005 年)。
Javier Fernández-Sanguino Peña <_> 维护此软件包(2005-2014 年)。
Christian Kastner <_> 维护此软件包(2010-2016 年)。
Georges Khaznadar <_> 维护此软件包(2022-2024 年)。
版权
版权所有 © 1994 Paul Vixie
可以自由分发,但有以下限制:不要从源代码或文档中删除我的姓名(不要冒领我的工作成果),标记您的更改(不要让我为您的可能存在的错误负责),不要更改或删除此通知。如果提供可构建的源代码给购买者,则可以出售。本软件不包含任何形式的保修,无论是明示的还是暗示的;使用本软件的风险由您自行承担,因使用本软件而对任何人造成的损害(如有),完全由用户承担。
自 1994 年以来,对本 man 手册进行了许多修改,这些修改由 Debian 开发人员编写,他们维护了 cron(TM);以上是一个简短的列表,更多信息可以在 /usr/share/doc/cron/copyright 文件中找到。