跳到内容

使用 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 目录中。

注意

请记住,此脚本还需要是可执行的 (chmod +x),以便 cron 能够运行它。

要列出正在运行的当前作业,请执行以下操作:

crontab -l

要列出用户创建的所有作业,请执行以下操作:

crontab -l -u <username>

要添加作业,您可以:

crontab -e

crontab 代表“cron 表”,该文件格式实际上是一个松散的表格布局。现在您已进入 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 技能。

作者:史蒂文·斯宾塞

贡献者:埃塞基耶尔·布鲁尼、甘娜·兹希尔诺娃