如何在 Ubuntu 18.04 上使用 Cron 自动执行任务

介绍

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

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

前提条件

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

无论您使用哪种类型的计算机来遵循本指南,它都应该具有非根用户配置的管理权限。

安装Cron

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

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

1sudo apt update

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

1sudo apt install cron

您需要确保它也设置为在背景中运行:

1sudo systemctl enable cron
1[secondary_label Output]
2Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
3Executing: /lib/systemd/systemd-sysv-install enable cron

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

了解Cron如何工作

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

要安排一个任务,打开你的crontab进行编辑,并添加以 _cron 表达式的形式写的任务. 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 * * * *. *. *. */': 可以使用带有星号的向前斜线来表示一步值. 例如,你不必写出八个单独的cron'任务,每隔三个小时运行一个命令(如0·0 * * *················'、0···············'等),而是可以安排这样运行:`0·································( )

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

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

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

如果您发现这些问题有些困惑,或者您想帮助为自己的cron任务编写日程表,则 Cronitor提供一个名为Crontab Gurucron日程表表达式编辑器(https://crontab.guru/),您可以使用它来检查您的cron日程表是否有效。

Crontabs 管理

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

如前所述,一个crontab是一个特殊的文件,它持有工作时间表cron将运行. 然而,这些不打算被直接编辑. 相反,建议您使用crontab命令. 这允许您编辑您的用户配置文件的crontab而不会改变您的权限sudocrontab命令还会让你知道你是否有crontab中的语法错误,而直接编辑它不会。

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

1crontab -e

如果这是你第一次在这个用户配置文件下运行crontab命令,它会提示你选择一个默认的文本编辑器,用于编辑你的crontab:

 1[secondary_label Output]
 2no crontab for sammy - using an empty one
 3
 4Select an editor. To change later, run 'select-editor'.
 5  1. /bin/nano        <---- easiest
 6  2. /usr/bin/vim.basic
 7  3. /usr/bin/vim.tiny
 8  4. /bin/ed
 9
10Choose 1-4 [1]:

或者,你可以按ENTER来接受默认选择,即nano

在进行选择后,您将被带到一个新的crontab,其中包含有关如何使用它的一些评论说明:

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

当你在未来运行crontab -e时,它会自动将你的crontab带到这个文本编辑器中。在编辑器中,你可以输入你的日程表,每个任务在一个新的行上。否则,你可以保存并关闭现在的crontab(CTRL + X,Y,然后ENTER,如果选择了nano).

<$>[注意] 注意:在Linux系统中,另一个crontab存储在/etc/目录中,这是一个全系统的crontab,有一个额外的字段,每个cron任务都应该运行在其中。

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/n)

当被提示时,您必须输入y以删除crontabn以取消删除。

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

例如,要拒绝所有用户的访问,然后向用户 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 DAEMON 将假定所有用户都可以访问cron,除非存在cron.allowcron.deny

特种语法

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

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

<$>[注] :不是所有cron戴蒙都可以解析这个语法(特别是较旧的版本),所以在您依靠它之前,请双重检查它工作。

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

1@reboot echo "System start up"

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

结论

Cron 是一个灵活而强大的实用程序,可以减少与系统管理相关的许多任务的负担。当与壳脚本相结合时,您可以自动化通常疲劳或复杂的任务,例如,您可以 [写壳脚本将数据备份发送到对象存储解决方案,然后用 cron 自动化)。

Published At
Categories with 技术
comments powered by Disqus