cron: 任务调度器

作者:Michael S. Keller

cron 守护进程 crond,与大多数 Linux 发行版一起打包,控制定期发生的作业的调度。当在进入多用户模式时启动后,crond 扫描目录 /var/spool/cron/crontabs 和 /etc/cron.d 以及文件 /etc/crontab 以查找要执行的工作。crond 然后每分钟唤醒一次,执行其作业记录表明它应该在该时间执行的工作,(默认情况下)将输出通过邮件发送给所有者用户,然后休眠直到下一分钟的开始。

与 Debian 2.0 打包的 crond 实现,即我在撰写本文时使用的发行版,以其作者 Paul Vixie 的名字命名为 Vixie Cron。我将使用 “cron” 来不同程度地指代 crond 进程和 cron 功能。

cron 的历史

cron 的发展是为了能够定期执行作业。您是否有机会使用 /var/log 中的日志文件?大多数 Linux 发行版都带有一组现成的 cron 作业来管理这些日志文件。如果没有 cron 作业,保存 /var 的文件系统最终会被日志文件完全填满。cron 的潜在用途超出了我对我的家庭环境所做的小的自定义。如果您想自动化运行多次的任务,请使用 cron。

如何使用 cron

个人用户可以使用 cron 来自动化任务。通常,所有用户都可以使用 cron。如果超级用户已创建 /etc/cron.allow 或 /etc/cron.deny,则对 cron 功能的访问取决于这些文件的内容。如果 /etc/cron.allow 存在,您的用户名必须出现在其中才能使用 cron。如果 /etc/cron.deny 存在但 /etc/cron.allow 不存在,您的用户名不得出现在 /etc/cron.deny 中,否则 cron 将无法为您工作。要编辑您的 cron 设置,请使用 crontab 命令

crontab -e

这将创建一个 cron 表,或 “crontab 文件”,cron 将读取该文件以查找工作。crontab 命令首先查找 VISUAL 环境变量,然后查找 EDITOR 环境变量。它将使用这些变量中命名的编辑器来提供 crontab 文件的编辑。如果没有设置这些环境变量之一,Debian 2.0 的 crontab 使用 ae 编辑器。其他发行版可能对 crontab 有不同的默认行为。进行您想要的更改,保存文件并退出编辑器。

为什么我们不直接编辑 crontab 文件?原因是 cron 对其作业条目需要特定的格式。crontab 命令在允许新编辑的 crontab 文件进入流通之前执行语法检查。如果新的 crontab 有语法错误,crontab 会抱怨并询问您是否要再次编辑。为了保护 crontab 文件,crontab 命令使 root 成为 crontab 文件的所有者。

列表 1。

要查看您新编辑的 crontab 文件,请使用此命令

crontab -l

输出应该类似于列表 1。每个 crontab 条目提供环境变量或特定于时间的 cron 命令。cron 自动设置一些环境变量。其他变量,例如 MAILTO,可以由用户设置。通常,cron 将每个 cron 作业的输出通过邮件发送给其所有者。如果您将以下行放入

MAILTO="fred"
在您的 crontab 文件中,您的 cron 作业的输出将转到用户 fred。更可能的是,您会想要抑制 cron 输出。如果您将 MAILTO 设置为空,
MAILTO=""
那么 cron 将丢弃作业输出。

特定于时间的 cron 命令中的字段按以下顺序出现:分钟(允许 0-59),小时(允许 0-23),月份中的日期(允许 1-31),月份(允许 1-12 或名称),星期几(允许 0-7 或名称,其中 0 和 7 都表示星期日),以及要运行的命令。数字字段还允许数字范围、通配符、列表以及每隔 N 个间隔运行 cron 作业的方法,例如每三小时一次。星号字符用作通配符,表示字段值的每次出现。有关详细信息,请参阅 crontab(5) 手册页。

下面的示例将在每月的第一天中午的每分钟运行 ls 命令,并丢弃输出

MAILTO=""
# Minute Hour Day-Of-Month Month Day-Of-Week
# Command
* 12 1 * * /usr/bin/ls

下一个示例将每隔一小时运行 free 命令,并将输出通过邮件发送给 fred

MAILTO="fred"
* */2 * * * /usr/bin/free
系统范围的 crontab 存储在文件 /etc/crontab 中,它提供了一种略有不同的方法来运行 cron 作业。它没有特殊的编辑器,因此在编辑它时必须格外小心。此外,它在星期几和命令字段之间提供了一个用户名 filed,以便在 root 以外的用户 ID 下运行作业,而无需为该用户创建单独的 crontab 文件。使用您喜欢的编辑器编辑它并保存更改;cron 将自动更新其作业列表。
预配置的 cron 作业

Debian 和 Red Hat 发行版带有多个预配置的 cron 作业,以帮助控制磁盘使用量。其他发行版可能会提供类似的帮助。Debian dh_installcron 命令将安装这些作业。通常,您不需要运行此命令——安装 cron 软件包将为您处理好一切。

这些作业位于文件 /etc/crontab 中,使用 run-parts 命令来调用目录 /etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 中的所有脚本。在大多数情况下,这些脚本控制磁盘使用量,压缩和修剪 /var/log 中的日志文件,并在 man(1) 命令的索引后进行清理。创建这些作业的软件包维护者将它们配置为在夜间运行,这通常是其他系统活动的缓慢时间。某些脚本会产生大量的磁盘活动,这可能会减慢其他 I/O 密集型作业。如果您希望它们在其他时间运行,请编辑 /etc/crontab 或在包含它们的目录之间移动脚本。

扩展阅读

请参阅侧边栏中的参考文献列表,以获取有关 cron 的扩展阅读资料。此外,at 功能的手册页可能也很有用。at 提供了一次性作业调度功能。如果您不让您的 Linux 系统每天 24 小时运行,您可能需要查看 Anacron,它不依赖于特定的时间事件来完成其工作。

结论

我对 cron 功能(Linux 和其他 UNIX 操作系统的一个典型组成部分)进行了简要介绍。它将为您希望您的 Linux 系统执行的与时间相关的工作提供一个起点。简而言之,如果您想调度重复性任务,以免一遍又一遍地键入相同的命令,请使用 cron。

资源

cron: Job Scheduler
Michael S. Keller 在 Sprint Paranet 担任技术分析师,Sprint Paranet 是 Sprint 的全资子公司,Sprint 是一家总部位于休斯顿的全国性网络服务提供商。他使用 UNIX 变体已有近九年,并喜欢与猫、摩托车和宇宙交流。您可以通过 mskeller@sprintparanet.com 与他联系。
加载 Disqus 评论