如何在 CentOS 8 上使用 Cron 自动执行任务

此教程的早期版本是由Shaun Lewis撰写的。

介绍

Cron是 Unix 类型操作系统,包括 Linux 发行版中发现的一种基于时间的任务编程 DAEMON,Cron 运行在后台,并以Cron 编程的任务,称为Cron 工作,自动执行,使Cron 可用于自动化维护相关的任务。

本指南提供了如何使用Cron的特殊语法来安排任务的概述,还介绍了一些可以用来使工作时间表更容易编写和理解的捷径。

前提条件

要完成此指南,您需要访问运行 CentOS 8 的计算机,这可能是您的本地计算机、虚拟机或虚拟私人服务器。

无论您使用哪种类型的计算机来遵循本指南,它都应该具有非根用户配置的管理权限. 要设置此功能,请遵循我们的 CentOS 8 初始服务器设置指南

安装Cron

几乎每个Linux发行版都有某种形式的Cron默认安装,但是,如果你使用的是没有Cron安装的CentOS机器,你可以使用dnf来安装它。

在在 CentOS 机器上安装 cron 之前,请更新计算机的本地包索引:

1sudo dnf update

然后用以下命令安装 cron daemon:

1sudo dnf install crontabs

此命令会提示您确认您想要安装crontabs包及其依赖程序,然后按y按下ENTER

這將會在您的系統上安裝 cron,但您需要手動啟動 DAEMON. 您還需要確保它隨著伺服器啟動時都會運行. 你可以使用「systemctl」命令執行這兩個操作。

要启动Cron Daemon,请执行以下命令:

1sudo systemctl start crond.service

要设置 cron 运行,每次服务器启动时,键入:

1sudo systemctl enable crond.service

随后,Cron将安装在您的系统上,并为您开始计划工作做好准备。

了解Cron如何工作

Cron 工作被记录和管理在一个称为crontab的特殊文件中,系统上的每个用户配置文件都可以有自己的 crontab,在那里他们可以计划工作,该文件被存储在/var/spool/cron/下。

要安排一个任务,你只需要打开你的crontab进行编辑,并添加一个以 cron 表达式 的形式写的任务。

该命令几乎可以是您通常在命令行上运行的任何命令. 语法的日程组件被分为5个不同的字段,这些字段以以下顺序写成:

FieldAllowed Values
minute0-59
hour0-23
Day of the month1-31
month1-12 or JAN-DEC
Day of the week0-6 or SUN-SAT

在 crontab 中安排的任务总体结构如下:

1minute hour day_of_month month day_of_week command_to_run

这个表达式运行命令 curl http://www.google.com 每周二下午5点30分:

130 17 * * 2 curl http://www.google.com

还有一些特殊字符可以包含在 cron 表达式的日程组件中,以便简化日程安排:

  • 联合国 *: 在克龙表达式中,星号是代表"所有"的通配符变量. 因此,与 . . . . . . . . . . . . . *',':逗号将调度值分解为列表. 如果要在起步和每个小时的中点执行一个任务,而不是写出两个独立的任务(如"0" *"."和"30"),可以用一个("0","30" *.")实现相同的功能. *-': 连字符代表调度字段中的一系列值. 与其为一个指令单独安排30个任务,你想每时30分钟跑一次(如"0*"".""1""."""2""."""等),不如只安排为"0-29""."".""."". "". 可以使用带有星号的向前斜线来表示一步值. 例如,你不用写出八个单独的单项任务,每隔三个小时运行一个命令(如0 0 * * * * *...',0 3 * *.',0 6 * *.'等),而是可以安排这样运行:`0 */3 * * *.'

<$>[注意] 注意:您不能任意表达步数值;您只能使用均匀划分到该字段允许的范围的整数。

以下是如何使用 cron 编程组件的其他示例:

  • * * * * - 每分鐘執行命令.
  • 12 * * * * - 每小時執行命令後12分鐘執行命令.
  • 0,15,30,45 * * * * - 每15分鐘執行命令.
  • /15 * * * * - 每15分鐘執行命令.
  • 0 4 * * * - 每天在下午4點執行命令。

如果您发现这些问题令人困惑,或者您想帮助为自己的 cron 任务编写时间表,则 Cronitor提供了名为 "Crontab Guru"的实用 cron 时间表表达式编辑器,您可以使用它来检查您的 cron 时间表是否有效。

Crontabs 管理

一旦你设定了一个时间表,你知道你想要运行的工作,你需要把它放在你的大象能够阅读的地方。

正如前面提到的,crontab是一个特殊的文件,它持有工作 cron的日程安排将运行. 然而,这些不是旨在被直接编辑. 相反,它是建议你使用crontab命令. 这允许你编辑你的用户配置文件的crontab而不改变你的权限与sudocrontab命令还会让你知道如果你有语法错误在crontab,而直接编辑它不会。

你可以用以下命令编辑你的 crontab:

1crontab -e

这将打开您的crontab在您的用户配置文件的默认文本编辑器。

<$>[注意] 注意:在新的CentOS 8服务器上,‘crontab -e’命令将默认地打开用户的crontab与‘vi’。

如果你想使用一个更容易接近的文本编辑器作为默认的crontab编辑器,你可以安装和配置nano

要做到这一点,安装nanodnf:

1sudo dnf install nano

当被提示时,按y,然后按ENTER,确认您想要安装nano

要将nano设置为用户配置文件的默认视觉编辑器,请打开.bash_profile文件进行编辑。

1nano ~/.bash_profile

在文件的底部,添加以下行:

1[label ~/.bash_profile]
2. . .
3export VISUAL="nano"

这将VISUAL环境变量设置为nanoVISUAL是许多程序(包括crontab)调用来编辑文件的Unix环境变量。

然后重新加载 .bash_profile 以便壳收集新的更改:

1. ~/.bash_profile

美元

一旦在编辑器中,你可以输入你的日程安排,每个任务在一个新的行上。否则,你可以保存和关闭 crontab 现在. 如果你打开了你的 crontab 用 vi,默认的 CentOS 8 文本编辑器,你可以这样做,通过按 ESC 以确保你处于 vi 命令模式,然后键入 :x 并按下 ENTER

请注意,在Linux系统中,还有另一个 crontab 存储在 /etc/ 目录中. 这是一个全系统的 crontab,它有一个额外的字段,每个 cron 工作都应该运行在其下方. 本教程专注于用户特定的 crontabs,但如果你想编辑全系统的 crontab,你可以用以下命令:

1sudo nano /etc/crontab

如果您想查看 crontab 的内容,但不编辑它,您可以使用以下命令:

1crontab -l

你可以用以下命令删除你的 crontab:

<$>[警告] 警告:以下命令不会要求您确认您想要删除您的 crontab。

1crontab -r

但是,您可以添加-i旗,以便命令提示您确认您实际想要删除用户的 crontab:

1crontab -r -i
1[secondary_label Output]
2crontab: really delete sammy's crontab?

当被提示时,您必须输入y来删除 crontab 或n来取消删除。

Cron 工作输出管理

由于 cron 任务是在背景中执行的,它并不总是显而易见,它们运行成功. 现在你知道如何使用crontab命令和如何计划 cron 任务,你可以开始尝试一些不同的方法来重定向 cron 任务的输出,以帮助你跟踪它们是否成功执行。

如果您有 mail transfer agent - 如 Sendmail - 安装并正确配置在您的服务器上,您可以将 cron 任务的输出发送到与您的 Linux 用户配置相关的电子邮件地址。

例如,您可以将下列行添加到 crontab. 这些包括一个MAILTO陈述,然后是示例电子邮件地址,一个SHELL指令,指示该壳要运行(在本示例中是bash),一个HOME指向搜索 cron 二进制的路径的指令,以及一个单一的 cron 任务:

1. . .
2
3MAILTO="[email protected]"
4SHELL=/bin/bash
5HOME=/
6
7* * * * * echo ‘Run this command every minute’

此特定任务将返回每分钟运行此命令,并且该输出将每分钟发送电子邮件到MAILTO指令后指定的电子邮件地址。

您还可以将 cron 任务的输出重定向到日志文件或空位置,以防止与输出一起收到电子邮件。

若要将日程式命令的输出附加到日志文件中,请在命令的末尾添加>>,然后添加您选择的日志文件的名称和位置,如下:

1* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

假设你想使用 cron 来运行脚本,但保持在后台运行. 要做到这一点,你可以将脚本的输出重定向到一个空的位置,例如 `/dev/null,这会立即删除任何写在其上的数据。

1* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

该 cron 工作还会将 standard error重定向到标准输出(>&1)。由于标准输出已经被重定向到 /dev/null,这基本允许脚本无声运行。

限制访问

您可以管理哪些用户被允许使用crontab命令与cron.allowcron.deny文件,这两个文件都存储在/etc/目录中。如果存在cron.deny文件,任何列出的用户都将被禁止编辑他们的 crontab。如果存在cron.allow,只有列出的用户才能编辑他们的 crontab。如果两个文件都存在,并且每个文件中都列出了相同的用户,则cron.allow文件将取代cron.deny,用户将能够编辑他们的 crontab。

例如,要拒绝所有用户的访问,然后向用户 ishmael提供访问权限,您可以使用以下命令序列:

1sudo echo ALL >>/etc/cron.deny
2sudo echo ishmael >>/etc/cron.allow

首先,我们通过将ALL附加到cron.deny文件中锁定所有用户,然后,通过将用户名附加到cron.allow文件中,我们为 ishmael用户配置文件提供执行 cron 任务的访问权限。

请注意,如果用户有sudo权限,他们可以用以下命令编辑另一个用户的crontab:

1sudo crontab -u user -e

但是,如果「cron.deny」存在,并且用户列在其中,而它们不列在「cron.allow」中,则在运行上一个命令后会收到以下错误:

1[secondary_label Output]
2The user user cannot use this program (crontab)

默认情况下,大多数 cron daemons 将假定所有用户都可以访问 cron,除非存在cron.allowcron.deny

特种语法

您可以在 crontab 文件中使用几种短语命令,以帮助简化工作日程安排,它们基本上是指定的相当数值日程安排的短语:

ShortcutShorthand for
@hourly0 * * * *
@daily0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly0 0 1 1 *

<$>[注意] 注意:并非所有Cron Daemons都能解析这个语法(特别是较旧的版本),所以在您依靠它之前,请双重检查它。

此外,@reboot短语将在服务器启动时执行随后的任何命令:

1@reboot echo "System start up"

只要有可能,使用这些快捷步骤可以帮助您更轻松地解释 crontab 中的任务日程安排。

结论

Cron 是一个灵活而强大的实用程序,可以减少与系统管理相关的许多任务的负担。当与壳脚本相结合时,您可以自动化通常是无聊或复杂的任务。

Published At
Categories with 技术
comments powered by Disqus