跳至内容

使用 croncrontab 自动化进程

先决条件

  • 一台运行 Rocky Linux 的计算机
  • 对使用您喜欢的编辑器(此处使用 vi)从命令行修改配置文件感到舒适

假设

  • 了解 bash、python 或其他脚本或编程工具的基础知识,并且您希望某个脚本能够自动运行
  • 您正在以 root 用户身份运行,或者有能力运行 sudo -s
    (您可以在自己的用户目录中以自己的用户身份运行某些脚本。在这种情况下,无需切换到 root。)

简介

Linux 提供了 cron 系统,一个基于时间的作业调度器,用于自动化进程。它简单而又非常强大。想让一个脚本或程序每天下午 5 点运行?这就是您设置的地方。

crontab 本质上是一个列表,用户可以在其中添加自己的自动化任务和作业,它有许多选项可以进一步简化事情。本文档将探讨其中的一些。对于有经验的用户来说,这是一个很好的回顾,而新用户可以将 cron 系统添加到他们的工具箱中。

在此简要讨论了 anacron,并将其与 cron 的“点”目录相关联。cronanacron 运行,这对不总是开机的机器(如工作站和笔记本电脑)很有帮助。原因是,虽然 cron 按计划运行作业,但如果机器在计划的作业时间关闭,作业将不会运行。有了 anacron,即使预定的运行时间已过,当机器重新开机时,作业也会运行。然而,anacron 使用一种更随机的方法来运行任务,其时间安排并不精确。这对工作站和笔记本电脑来说是合理的,但对服务器则不然。例如,对于服务器备份等需要特定时间运行作业的情况,这可能是一个问题。这时 cron 为服务器管理员提供了最佳解决方案。尽管如此,服务器管理员和工作站或笔记本电脑用户都可以从这两种方法中获益。您可以根据自己的需求进行混合搭配。有关 anacron 的更多信息,请参阅 anacron - 自动化命令

轻松入门 - cron 的“点”目录

在许多 Linux 系统中,cron 的“点”目录已内置多年,有助于快速自动化进程。这些目录以 cron 系统根据其命名约定调用的目录形式出现。然而,它们运行方式不同,具体取决于分配给调用它们的进程 anacroncron。默认行为是使用 anacron,但这可以由服务器、工作站或笔记本电脑管理员更改。

对于服务器

如引言所述,cron 通常在如今使用 anacron 来运行这些“点”目录中的脚本。您可能也想在服务器上使用这些“点”目录,如果这样的话,则需要采取两个步骤来验证这些“点”目录是否按严格的时间表运行。为此,您需要安装一个包并删除另一个包

dnf install cronie-noanacron

dnf remove cronie-anacron

正如您可能预料的那样,这会从服务器上移除 anacron,并恢复在“点”目录中按严格时间表运行任务。/etc/cron.d/dailyjobs 文件控制着时间表,其内容如下

# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly

这相应地转换为

  • 每天在 04:02:00 运行 cron.daily 中的脚本。
  • 每周日在 04:22:00 运行 cron.weekly 中的脚本。
  • 每月一日在 04:42:00 运行 cron.monthly 中的脚本。

对于工作站

如果您想在工作站或笔记本电脑上的 cron “点”目录中运行脚本,您无需做任何复杂的事情。将您的脚本文件复制到相关目录中,并确保它是可执行的。以下是目录

  • /etc/cron.hourly - 放在这里的脚本每小时的第 1 分钟运行(无论 anacron 是否存在,都由 cron 运行)
  • /etc/cron.daily - 放在这里的脚本每天运行。anacron 会调整这些脚本的时间(参见提示)
  • /etc/cron.weekly - 放在这里的脚本每 7 天运行一次,基于上次运行时间的日历日期(参见提示)
  • /etc/cron.monthly - 放在这里的脚本每月运行一次,基于上次运行时间的日历日期(参见提示)

技巧

这些脚本很可能在每天、每周和每月大致相同的(但不是完全相同的)时间运行。有关更精确的运行时间,请参见下面的 @选项。

前提是您对让系统自动运行脚本感到满意,并允许它们在指定时间内运行,这简化了任务的自动化。

注意

没有任何规定说服务器管理员不能使用 anacron 用于运行“点”目录中的脚本的随机运行时间。用例是用于非时间敏感的脚本。

创建您自己的 cron

如果工作站的自动化、随机时间不合适,或者服务器的计划时间不合适,您可以创建自己的。在此示例中,假设您是以 root 用户身份执行此操作。要做到这一点,请输入以下命令

crontab -e

这将以您选择的编辑器打开当前 root 用户的 crontab,它可能看起来像这样。请阅读此注释版本,因为它对您接下来将使用的每个字段都有描述

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# cron
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

请注意,这个特定的 crontab 文件有一些内置的文档。并非总是如此。在修改容器或极简操作系统上的 crontab 时,crontab 将是一个空文件,除非其中有一个条目。

假设您有一个备份脚本,您想在晚上 10 点运行它。crontab 使用 24 小时制,这将是 22:00。假设您的备份脚本是“backup”,并且它当前位于 /usr/local/sbin 目录中。

注意

请记住,为了让 cron 运行此脚本,它还需要是可执行的(chmod +x)。

列出当前正在运行的作业

crontab -l

列出用户创建的所有作业

crontab -l -u <用户名>

要添加作业,您

crontab -e

crontab 是“cron table”的缩写,该文件的格式实际上是一种松散的表格布局。现在您已进入 crontab,请移至文件底部并添加您的条目。如果您将 vi 用作默认系统编辑器,您将通过以下按键执行此操作

Shift+:+$

现在您已到达文件底部,请插入一行并添加简短注释以描述您的条目正在做什么。您可以通过在行首添加“#”来完成此操作

# 每天晚上 10 点备份系统

Enter。您应该仍处于插入模式,因此下一步是添加您的条目。正如我们在上面的空注释 crontab 中所示,这是 m 代表分钟,h 代表小时,dom 代表月份中的日期,mon 代表月份,dow 代表星期几。

要在每天 10:00 运行我们的备份脚本,条目如下

00 22 * * * /usr/local/sbin/backup

这表示在晚上 10 点运行脚本,每个月的每一天,每一年,以及每周的每一天。这是一个简单的例子,当您需要特定细节时,事情会变得相当复杂。

crontab 的 @选项

另一种按严格安排的时间(即,日、周、月、年等)运行作业的方法是使用 @选项,它们提供了使用更自然的时间安排的能力。@选项包括

  • @hourly 每小时的第 0 分钟运行一次脚本(这与将脚本放在 /etc/cron.hourly 中的结果完全相同)。
  • @daily 每天午夜运行一次脚本。
  • @weekly 每周日午夜运行一次脚本。
  • @monthly 每月第一天午夜运行一次脚本。
  • @yearly 每年 1 月 1 日午夜运行一次脚本。
  • @reboot 仅在系统启动时运行脚本。

注意

使用这些 crontab 条目会绕过 anacron 系统,并恢复到 crond.service,无论 anacron 是否已安装。

对于我们的备份脚本示例,如果您使用 @daily 选项在午夜运行备份脚本,则条目如下

@daily /usr/local/sbin/backup

更复杂的选项

到目前为止,使用的解决方案都是相当简单的选项,但更复杂的任务时间安排呢?假设您想在白天每 10 分钟运行一次您的备份脚本(可能不是实际的做法,但这是一个例子!)。为此,您的 crontab 是

*/10 * * * * /usr/local/sbin/backup

如果您想每 10 分钟运行一次备份,但只在周一、周三和周五运行呢?

*/10 * * * 1,3,5 /usr/local/sbin/backup

每 10 分钟运行一次,每天都运行,但周六和周日除外呢?

*/10 * * * 1-5 /usr/local/sbin/backup

在表格中,逗号允许您在字段内指定单个条目,而连字符允许您指定字段内的值范围。这适用于任何字段,并且可以同时适用于许多字段。正如您所见,事情会变得相当复杂。

在确定何时运行脚本时,您需要花时间计划好,特别是当标准复杂时。

结论

cron/crontab 系统是 Rocky Linux 系统管理员或桌面用户的强大工具。它允许您自动化任务和脚本,这样您就不必记住手动运行它们。更复杂的示例在此

虽然基础知识并不难,但选项可能会更复杂。有关 crontab 的更多信息,请访问 crontab 手册页。在大多数系统上,您也可以输入 man crontab 以获取其他命令详细信息。您也可以在网上搜索“crontab”,这将为您提供大量有助于您精炼 crontab 技能的结果。

作者:Steven Spencer

贡献者:Ezequiel Bruni, Ganna Zhyrnova