如何在VPS上使用Cron和Anacron调度例程任务

您在Linux服务器上执行的许多任务是重复的,必须定期运行。 cron和anacron实用程序可用于调度任务以在特定时间间隔在后台运行。在本指南中,我们将讨论的基本知识

什么是Cron?

Cron是一个计划实用程序,允许您分配任务以在预配置的时间运行。 一个基本的工具,cron可以用来自动化几乎任何在你的系统上,必须定期发生。

同样熟练地管理必须每小时或每天执行的任务以及每年必须执行一次或两次的大型例程,cron是系统管理员的必备工具。

在本指南中,我们将讨论如何从命令行使用cron以及如何读取其配置文件。 我们还将探讨anacron,一种工具,可以用来确保任务运行,即使服务器在部分时间关闭。

我们将使用Ubuntu 12.04 VPS,但是任何现代Linux发行版都应该以类似的方式运行。

Cron如何工作

Cron在引导时启动,并在后台作为守护程序运行。 这意味着它运行没有用户交互,并等待某些事件发生以决定何时执行。

在cron的情况下,这些事件是时间的某些时刻。 Cron在后台运行,并每分钟检查其配置文件一次,以查看事件是否计划运行该分钟。

如果事件被调度,cron执行任何预定的命令给它,然后回到后台一分钟。 如果没有安排事件,它将等待60秒,然后再次检查。

由于这种逐分钟的调度,它是非常灵活和可配置的。 安装发布后,cron已配置为运行各种任务。

如何读取Crontab

Cron通过读取一系列文件(每个文件称为“crontab”)决定哪些命令在什么时间运行。 我们可以通过查看“/ etc / crontab”来查看系统范围的crontab:

less /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

这是系统crontab,不应该在大多数情况下编辑。 大多数时候最好使用你自己的crontab。 系统文件可能会在更新中替换,您的更改将丢失。

该文件有一些有趣的部分,我们需要了解。

前两行指定将执行列出的命令的shell和检查程序的路径。

文件的其余部分指定实际的命令和调度。 此列表中的每行都表示表中的记录或行。 “crontab”中的“选项卡”表示表。 每个表单元格由用空格或制表符分隔的列表示。

表格上方的注释行提示每个列代表的内容:

# m h dom mon dow user  command

使用Cron计划小时和分钟

第一列是命令应该运行的小时的分钟(0-59)。 第二列是一天中的小时,从0-23,它应该运行。 星号(*)表示“每个可能的值”,并用作通配符。

通过组合前两列,我们可以得到命令的时间值。 例如,表中的第二行在minutes列中有25个,在hours列中有6个:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

这意味着第二行应该在早上6:25运行。

类似地,第一行意味着命令应该每小时运行一次,在17分钟过去的小时:

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

所以它将在凌晨1:17,上午2:17,上午3:17等运行。

与Cron计划天

第三,第四和第五列确定应该在哪些天运行命令。 第三列指定一个月中的某一天,1-31(在月底的时间安排时要小心,因为并非所有月份的天数都相同)。

第四列指定应从哪个月份开始运行命令,从1-12开始,第五列保留,用于指定应该运行命令的星期几,0和7都表示星期日。 最后一个允许您按周而不是按月计划。

如果星期几和月份日期列都有不是通配符的值,那么如果任一列匹配,则命令将执行。

星期几和月份也可以用其姓名的前三个字母指定。 我们还可以使用带连字符( - )的范围,并使用逗号(,)选择多个值。

我们还可以通过跟随一个带有/和数字的值来指定间隔。 例如,要每隔一小时执行一次命令,我们可以在小时列中放置“* / 2”。

如果我们看看crontab,你会看到第三条记录是每个星期天在上午6:47运行:

47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

第四条记录在本月的第一天上午6:52运行:

52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

使用时间快捷键计划

如果您有简单的要求,可以使用命名的快捷方式替换每个记录的前五列。 这些的语法是“@”,后跟命名的间隔。

例如,我们可以通过指定“@weekly”而不是创建五列配置来安排每周执行的内容。 其他选择是“@yearly”,“@monthly”,“@daily”和“@hourly”。

还有一个特殊的快捷方式叫“@reboot”,一旦cron启动就运行。 这通常只发生在系统启动时,这就是为什么它被称为“重新启动”而不是“cron-restart”或类似的。

请记住,这些快捷方式不提供细粒度的控制,当它们运行时。 它们也都配置为在匹配时间的第一可能时刻运行。

例如,“@monthly”将在每月第一天的午夜运行。 这可能导致许多命令安排为一次运行,如果它们都在同一时间。 你不能像传统的调度语法一样错开这些事件。

使用Cron指定命令和用户

接下来的列涉及预定的命令的实际执行。

第六列,只存在于我们正在查看的系统crontab中,命名该命令应该被执行的用户。

最后一列指定应该执行的实际命令。 该命令可以包含百分号(%),这意味着超出第一个百分比符号的所有内容都将作为标准输入传递给命令。

每个记录需要以换行符结束。 这不是大多数条目的问题,但请确保在最后一个条目后有一个空行,否则命令将无法正常运行。

使用运行部分和Cron目录

如果你看看在系统crontab中指定的命令,你会看到一个“anacron”,我们将在后面讨论,和“运行部分”。

run-parts命令是运行位于指定目录中的每个可执行文件的简单命令。 它与cron广泛使用,因为它允许您通过将它们放在一个位置在指定的时间运行多个脚本。

这有一个优点,允许crontab保持干净和简单,并允许您添加额外的脚本,只需将它们放在或将它们链接到相应的目录,而不是调整crontab。

默认情况下,大多数发行版会为每个时间间隔设置文件夹,并将脚本或链接放置到要在该时间间隔运行的脚本。

例如,Ubuntu有名为“cron.daily”,“cron.hourly”,“cron.monthly”和“cron.weekly”的文件夹。 这些文件夹内是适当的脚本。

使用用户特定的Crontab

现在,您已了解cron的语法,您可以使用它为您自己的用户创建计划任务。 我们可以使用“crontab”命令来做到这一点。

因为crontab中的命令将以您的用户权限运行,所以“user”列在用户特定的crontabs中不存在。

要查看您当前的crontab,请键入:

crontab -l

你可能不会有一个,除非你手动创建它。 如果您有crontab,最好在编辑之前备份当前副本,以便您所做的任何更改都可以还原。

要将备份存储在主目录中名为“cron.bak”的文件中,请运行:

crontab -l > ~/cron.back

要编辑crontab,请键入:

crontab -e
no crontab for demouser - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        

You might be given a selection prompt similar to the one above your first time using this command. Select the editor you prefer to continue.

You will be dropped into a commented file that you can edit to create your own rules.

As a nonsensical example, if we wanted to echo the date into a file every 15 minutes every Wednesday, we could place this line into the file:

*/15 * * * 3 echo "$(date)" >> /home/demouser/file

We can then save the file and now, when we run "crontab -l", we should see the rule we just created:

crontab -l
. . .
. . .
*/15 * * * 3 echo "$(date)" >> /home/demouser/file

If you need to edit the crontab of a specific user, you can also add the "-u username" option. You will only be able to do this as root or with an account with administrative privileges.

For instance, if you would like to add something to the "root" crontab, you could issue:

sudo crontab -u root -e

Using Anacron with Cron

One of cron's biggest weaknesses is that it assumes that your server or computer is always on. If your machine is off and you have a task scheduled during that time, the task will never run.

This is a serious problem with systems that cannot be guaranteed to be on at any given time. Due to this scenario, a tool called "anacron" was developed. Anacron stands for anachronistic, and it is used compensate for this problem with cron.

Anacron uses parameters that are not as detailed as cron's options. The smallest increment that anacron understands is days. This means that anacron should be used to complement cron, not to replace it.

Anacron's advantage is that it uses time-stamped files to find out when the last time its commands were executed. This means, if a task is scheduled to be run daily and the computer was turned off during that time, when anacron is run, it can see that the task was last run more than 24 hours ago and execute the task correctly.

The anacron utility has a scheduling table just like cron does. It is appropriately named "anacrontab" and is located in the "/etc" directory as well. Let's see how it is formatted:

less /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These replace cron's entries
1       5       cron.daily       nice run-parts --report /etc/cron.daily
7       10      cron.weekly      nice run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly nice run-parts --report /etc/cron.monthly

We can see that it follows a similar format to the "crontab" files, but there are fewer columns and some noticeable differences.

The first column specifies how often the command should be run. It is given as an interval in days. A value of "1" will run every day, while a value of "3" will run every three days.

The second column is the delay to use before executing the commands. Anacron is not a daemon. It is run explicitly at one time. This field allows you to stagger execution so that not every task is running at the same time.

For example, the first line runs every day, five minutes after anacron is called:

1       5       cron.daily       nice run-parts --report /etc/cron.daily

The following line is run weekly (every 7 days), ten minutes after anacron is called:

7       10      cron.weekly      nice run-parts --report /etc/cron.weekly

The third column contains the name that the job will be known as in the anacron's messages and log files. The fourth field is the actual command that is run.

You can see that anacron is set to run some of the same scripts that are run by cron. Distributions handle this clash differently, by creating a preference for either cron or anacron and making the other program not execute the rule.

For instance, on Ubuntu, the "/etc/crontab" tests if anacron is available on the system, and only executes the scripts in the cron.* directories with cron if anacron is not found.

Other distributions have cron update the anacron's time-stamps every time it runs the contents of these directories, so that anacron does not execute when it is called.

Conclusion

Both cron and anacron are useful tools for when you need to automate processes. Understanding how to leverage their strengths and work around their weaknesses will allow you to utilize them easily and effectively.

Although the configuration syntax may be confusing at first, these tools will save you time in the long run and usually do not have to be adjusted often once you have a good working schedule.

您可能会使用此命令给予类似于您第一次上面的选择提示。 选择您希望继续的编辑器。

您将被删除到已注释的文件中,您可以编辑该文件以创建自己的规则。

作为一个荒谬的例子,如果我们想要每个星期三每15分钟将日期回显一个文件,我们可以将这行代码放入文件:

*/15 * * * 3 echo "$(date)" >> /home/demouser/file

然后我们可以保存文件,现在,当我们运行“crontab -l”时,我们应该看到我们刚刚创建的规则:

crontab -l
. . .
. . .
*/15 * * * 3 echo "$(date)" >> /home/demouser/file

如果您需要编辑特定用户的crontab,您还可以添加“-u username”选项。 您只能以root身份或具有管理权限的帐户执行此操作。

例如,如果你想添加一些东西到“根”crontab,你可以发出:

sudo crontab -u root -e

使用Anronron和Cron

cron的最大弱点之一是它假定你的服务器或计算机总是打开。 如果您的计算机已关闭,并且您在此期间计划了一个任务,则该任务将永远不会运行。

这是一个严重的问题,系统不能保证在任何给定的时间。 由于这种情况,开发了一个名为“anacron”的工具。 Anacron代表时代错误,它用于补偿与cron的这个问题。

Anacron使用的参数不如cron的选项详细。 anacron理解的最小增量是天。 这意味着anacron应该用于补充cron,而不是替代它。

Anacron的优势在于它使用带时间戳的文件来找出上次执行命令的时间。 这意味着,如果计划每天运行任务并且计算机在该时间内关闭,则在运行anacron时,可以看到该任务上次运行超过24小时,并且正确执行任务。

anacron实用程序具有与cron类似的调度表。 它被恰当地命名为“anacrontab”,并且也位于“/ etc”目录中。 让我们看看它是如何格式化的:

less /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These replace cron's entries
1       5       cron.daily       nice run-parts --report /etc/cron.daily
7       10      cron.weekly      nice run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly nice run-parts --report /etc/cron.monthly

我们可以看到它遵循与“crontab”文件类似的格式,但是列数和一些明显的差异较少。

第一列指定应该多长时间运行命令。 它以天为单位以间隔给出。 值为“1”将每天运行,而值“3”将每三天运行一次。

第二列是在执行命令之前使用的延迟。 Anacron不是一个守护进程。 它一次显式运行。 此字段允许您交错执行,以便不是每个任务都在同一时间运行。

例如,第一行每天运行,在anacron被调用后五分钟:

1       5       cron.daily       nice run-parts --report /etc/cron.daily

以下行每周(每7天)运行一次,在anacron被调用后10分钟:

7       10      cron.weekly      nice run-parts --report /etc/cron.weekly

第三列包含作业在anacron的消息和日志文件中将被称为的名称。 第四个字段是运行的实际命令。

您可以看到anacron设置为运行由cron运行的一些相同的脚本。 分布式通过创建cron或anacron的首选项并使其他程序不执行规则,以不同的方式处理此冲突。

例如,在Ubuntu上,“/ etc / crontab”测试系统上是否有anacron可用,并且只有在没有找到anacron的情况下才使用cron执行cron。*目录中的脚本。

其他发行版都会在每次运行这些目录的内容时更新anacron的时间戳,以便anacron在调用时不会执行。

结论

当你需要自动化进程时,cron和anacron都是有用的工具。 了解如何利用他们的优势和解决他们的弱点,将允许您轻松有效地利用它们。

虽然配置语法一开始可能会让人困惑,但这些工具将为您节省时间,而且通常在您有良好的工作时间表之后不必频繁调整。