此教程的早期版本是由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个不同的字段,这些字段以以下顺序写成:
Field | Allowed Values |
---|---|
minute | 0-59 |
hour | 0-23 |
Day of the month | 1-31 |
month | 1-12 or JAN-DEC |
Day of the week | 0-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而不改变你的权限与sudo
。 crontab
命令还会让你知道如果你有语法错误在crontab,而直接编辑它不会。
你可以用以下命令编辑你的 crontab:
1crontab -e
这将打开您的crontab在您的用户配置文件的默认文本编辑器。
<$>[注意] 注意:在新的CentOS 8服务器上,‘crontab -e’命令将默认地打开用户的crontab与‘vi’。
如果你想使用一个更容易接近的文本编辑器作为默认的crontab编辑器,你可以安装和配置nano
。
要做到这一点,安装nano
与dnf
:
1sudo dnf install nano
当被提示时,按y
,然后按ENTER
,确认您想要安装nano
。
要将nano
设置为用户配置文件的默认视觉编辑器,请打开.bash_profile
文件进行编辑。
1nano ~/.bash_profile
在文件的底部,添加以下行:
1[label ~/.bash_profile]
2. . .
3export VISUAL="nano"
这将VISUAL
环境变量设置为nano
。VISUAL
是许多程序(包括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.allow
和cron.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.allow
或cron.deny
。
特种语法
您可以在 crontab 文件中使用几种短语命令,以帮助简化工作日程安排,它们基本上是指定的相当数值日程安排的短语:
Shortcut | Shorthand for |
---|---|
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
<$>[注意] 注意:并非所有Cron Daemons都能解析这个语法(特别是较旧的版本),所以在您依靠它之前,请双重检查它。
此外,@reboot
短语将在服务器启动时执行随后的任何命令:
1@reboot echo "System start up"
只要有可能,使用这些快捷步骤可以帮助您更轻松地解释 crontab 中的任务日程安排。
结论
Cron 是一个灵活而强大的实用程序,可以减少与系统管理相关的许多任务的负担。当与壳脚本相结合时,您可以自动化通常是无聊或复杂的任务。