分类
文章

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

介绍

Cron是一个基于时间的作业调度守护程序,可在类似Unix的操作系统(包括Linux发行版)中找到。Cron在后台运行,并且使用cron计划的任务(称为“ cron作业”)会自动执行,这使cron对于自动执行与维护相关的任务非常有用。

本指南概述了如何使用cron的特殊语法安排任务。它还介绍了一些捷径,您可以使用这些捷径使工作计划更易于编写和理解。

先决条件

要完成本指南,您需要访问运行CentOS 8的计算机。该计算机可以是本地计算机,虚拟机或虚拟专用服务器。

无论您使用哪种计算机来遵循本指南,它都应该具有配置了管理特权的非root用户。要进行设置,请遵循我们的CentOS 8初始服务器设置指南

安装Cron

默认情况下,几乎每个Linux发行版都安装了某种形式的cron。但是,如果您使用的是未安装cron的CentOS计算机,则可以使用进行安装dnf

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

  • sudo dnf update

然后使用以下命令安装cron守护程序:

  • sudo dnf install crontabs

该命令将提示您确认要安装crontabs软件包及其依赖项。按这样做yENTER

这将在您的系统上安装cron,但是您需要手动启动守护程序。您还需要确保将其设置为在服务器启动时运行。您可以使用systemctl命令执行这两个操作。

要启动cron守护程序,请运行以下命令:

  • sudo systemctl start crond.service

要将cron设置为在服务器启动时运行,请键入:

  • sudo systemctl enable crond.service

然后,将cron安装在您的系统上,并准备开始调度作业。

了解Cron的工作方式

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

要安排工作,您只需要打开crontab进行编辑并添加以cron表达式形式编写的任务。cron表达式的语法可以分为两个元素:调度和要运行的命令。

该命令实际上可以是您通常在命令行上运行的任何命令。语法的时间表组件分为5个不同的字段,按以下顺序编写:

领域 允许值
分钟 0-59
小时 0-23
一个月中的某天 1-31
1-12 要么 JAN-DEC
一周中的天 0-6 要么 SUN-SAT

一起,在crontab中调度的任务的结构如下:

minute hour day_of_month month day_of_week command_to_run

这是cron表达式的功能示例。该表达式在curl http://www.google.com每个星期二的下午5:30 运行命令:

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

您还可以在cron表达式的计划组件中包括一些特殊字符,以使计划更加容易:

  • *:在cron表达式中,星号是表示“全部”的通配符变量。因此,计划的任务* * * * * ...将在每月的每月的每一小时的每一分钟运行。
  • ,:逗号将调度值分解成一个列表。如果您希望在每小时的开始和中间运行一个任务,而不是写出两个单独的任务(例如0 * * * * ...30 * * * * ...),则可以使用一个(0,30 * * * * ...)实现相同的功能。
  • -:连字符表示日程表字段中的值范围。而不必为要为每个小时的第30分钟运行命令30个独立的计划任务(如0 * * * * ...1 * * * * ...2 * * * * ...,等),你可以只安排它0-29 * * * * ...
  • /:您可以使用带星号的正斜杠来表示步长值。例如,而不是写了八个独立的独立的后台任务运行命令每隔三小时(如,0 0 * * * ...0 3 * * * ...0 6 * * * ...,等等),你可以安排它这样运行:0 */3 * * * ...

注意:您不能任意表达步长值;您只能使用整数,该整数平均分配到相关字段所允许的范围内。例如,在“时间”字段,你只能跟着一个斜杠123468,或12

以下是一些更多有关如何使用cron的调度组件的示例:

  • * * * * * -每分钟运行一次命令。
  • 12 * * * * -每小时12分钟后运行命令。
  • 0,15,30,45 * * * * -每15分钟运行一次命令。
  • */15 * * * * -每15分钟运行一次命令。
  • 0 4 * * * -每天凌晨4:00运行命令。
  • 0 4 * * 2-4 -在每个星期二,星期三和星期四的4:00 AM运行命令。
  • 20,40 */8 * 7-12 * -在一年的最后六个月中的每天第八天的第20和40分钟运行命令。

如果您发现任何令人困惑的地方,或者想要帮助您为自己的cron任务编写时间表,Cronitor都会提供一个方便的cron时间表表达式编辑器,名为“ Crontab Guru”,可用于检查您的cron时间表是否有效。

管理Crontab

一旦确定了时间表,并且知道要运行的作业,就需要将其放在守护程序可以读取的位置。

如前所述,crontab是一个特殊文件,其中包含cron将运行的作业计划。但是,这些内容不打算直接进行编辑。相反,建议您使用该crontab命令。这使您可以编辑用户配置文件的crontab,而无需使用更改权限sudo。该crontab命令还将让您知道crontab中是否存在语法错误,而直接进行编辑则不会。

您可以使用以下命令编辑crontab:

  • crontab -e

这将在用户个人资料的默认文本编辑器中打开crontab。

注意:在新的CentOS 8服务器上,默认情况下,该crontab -e命令将打开用户的crontab vivi是一个非常强大且灵活的文本编辑器,但对于缺乏使用经验的用户而言,它可能会感到有些呆板。

如果您想使用更易于接近的文本编辑器作为默认的crontab编辑器,则可以这样安装和配置nano

要做到这一点,安装nanodnf

  • sudo dnf install nano

出现提示时,按y,然后ENTER确认要安装nano

要将其设置nano为用户配置文件的默认视觉编辑器,请打开.bash_profile文件进行编辑。现在您已经安装了它,您可以使用以下命令进行安装nano

  • nano ~/.bash_profile

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

〜/ .bash_profile
. . .
export VISUAL="nano"

这会将VISUAL环境变量设置为nanoVISUAL是Unix环境变量,许多程序(包括crontab)都调用该变量来编辑文件。添加此行之后,按,然后按CTRL + X,保存并关闭文件。YENTER

然后重新加载,.bash_profile以便shell获取新的更改:

  • . ~/.bash_profile

进入编辑器后,您可以在新行中输入每个作业的时间表。否则,您可以暂时保存并关闭crontab。如果使用vi默认的CentOS 8文本编辑器打开了crontab ,则可以通过按ESC来确定您处于vi命令模式,然后键入:x并按来执行此操作ENTER

请注意,在Linux系统上,该/etc/目录下存储了另一个crontab 。这是系统范围的crontab,具有一个附加字段,每个cron作业都应在该字段下运行。本教程侧重于特定于用户的crontab,但是,如果要编辑系统范围的crontab,可以使用以下命令进行编辑:

  • sudo nano /etc/crontab

如果要查看crontab的内容但不对其进行编辑,则可以使用以下命令:

  • crontab -l

您可以使用以下命令擦除crontab:

警告:以下命令不会要求您确认要删除crontab。仅在确定要删除它时才运行它

  • crontab -r

此命令将立即删除用户的crontab。但是,可以包含该-i标志,以使命令提示您确认您确实要删除用户的crontab:

  • crontab -r -i
Output
crontab: really delete sammy's crontab?

出现提示时,您必须输入y以删除crontab或n取消删除。

管理Cron作业输出

由于cron作业是在后台执行的,因此不一定总是可以成功运行它们。现在,您知道如何使用crontab命令以及如何计划cron作业,您可以开始尝试一些不同的方法来重定向cron作业的输出,以帮助您跟踪它们是否已成功执行。

如果您在服务器上安装并正确配置了邮件传输代理(例如Sendmail),则可以将cron任务的输出发送到与Linux用户配置文件关联的电子邮件地址。您还可以通过MAILTO在crontab顶部提供一个设置来手动指定电子邮件地址。

例如,您可以将以下几行添加到crontab中。其中包括一个MAILTO语句,后跟一个示例电子邮件地址,一个SHELL指示要运行的shell 的指令(bash在此示例中),一个HOME指向搜索cron二进制文件的路径的指令以及一个cron任务:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

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

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

要将调度命令的输出附加到日志文件,请>>在命令末尾添加所选日志文件的名称和位置,如下所示:

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

假设您要使用cron来运行脚本,但要使其在后台运行。为此,您可以将脚本的输出重定向到一个空位置,就像/dev/null这样会立即删除写入其中的所有数据。例如,以下cron作业执行一个PHP脚本并在后台运行它:

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

此cron作业还将重定向由标准表示的标准错误2到标准输出(>&1)。因为标准输出已经被重定向到/dev/null,这实际上允许脚本静默运行。即使crontab包含一条MAILTO语句,命令的输出也不会发送到指定的电子邮件地址。

限制访问

您可以使用和文件管理允许哪些用户使用该crontab命令,这两个文件都存储在目录中。如果该文件存在,则其中列出的所有用户都将被禁止编辑其crontab。如果存在,则只有其中列出的用户才能编辑其crontab。如果两个文件都存在,并且每个文件中都列出了同一用户,则该文件将被覆盖,并且用户将能够编辑其crontab。cron.allowcron.deny/etc/cron.denycron.allowcron.allowcron.deny

例如,要拒绝对所有用户的访问,然后对用户ishmael授予访问权限,可以使用以下命令序列:

  • sudo echo ALL >>/etc/cron.deny
  • sudo echo ishmael >>/etc/cron.allow

首先,我们通过附加ALLcron.deny文件来锁定所有用户。然后,通过将用户名附加到cron.allow文件中,我们授予ishmael用户配置文件访问权限以执行cron作业。

请注意,如果用户具有sudo特权,则可以使用以下命令来编辑另一个用户的crontab:

  • sudo crontab -u user -e

但是,如果cron.deny存在并且用户在其中列出,而用户未在中列出,则cron.allow在运行上一条命令后,您将收到以下错误:

Output
The user user cannot use this program (crontab)

默认情况下,大多数cron守护程序将假定所有用户都有权访问cron,除非其中一个存在cron.allowcron.deny存在。

特殊语法

您还可以在crontab文件中使用一些速记命令来帮助简化作业计划。它们本质上是指定的等效数字时间表的快捷方式:

捷径 的简写
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

注意:并非所有cron守护程序都可以解析此语法(尤其是较旧的版本),因此在您依赖它之前请仔细检查它是否有效。

此外,@reboot无论服务器何时启动,该速记都将运行紧随其后的任何命令:

@reboot echo "System start up"

尽可能使用这些快捷方式可以帮助您更轻松地解释crontab中的任务计划。

结论

Cron是一种灵活而强大的实用程序,可以减轻与系统管理相关的许多任务的负担。与shell脚本结合使用时,您可以使通常繁琐或复杂的任务自动化。

发表评论

电子邮件地址不会被公开。 必填项已用*标注