如何在VPS上使用Cron和Anacron安排日常任务

来自菜鸟教程
跳转至:导航、​搜索

什么是克隆?

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”中的“tab”代表表格。 每个表格单元格由空格或制表符分隔的列表示。

表格上方的注释行给出了关于每列代表什么的提示:

# m h dom mon dow user  command

使用 Cron 安排时间和分钟

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

通过结合前两列,我们可以获得命令的时间值。 例如,表中的第二行在分钟列中有 25 个,在小时列中有 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 启动后立即运行。 这通常只在系统启动时发生,这就是为什么它被称为“reboot”而不是“cron-restart”或类似的东西。

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

例如,“@monthly”将在每月第一天的午夜运行。 如果它们都落在同一时间,这可能会导致许多命令计划同时运行。 您无法像使用常规调度语法那样错开这些事件。

使用 Cron 指定命令和用户

接下来的列涉及计划命令的实际执行。

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

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

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

使用运行部件和 Cron 目录

如果您查看系统 crontab 中指定的命令,您会看到提及“anacron”(我们将在后面讨论)和“run-parts”。

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

这样做的好处是可以让 crontab 保持干净和简单,并允许您通过简单地将它们放入或将它们链接到适当的目录来添加其他脚本,而不是调整 crontab。

默认情况下,大多数发行版都为每个时间间隔设置文件夹,它们放置脚本或链接到他们希望在该时间间隔运行的脚本。

例如,Ubuntu 有名为“cron.daily”、“cron.hourly”、“cron.monthly”和“cron.weekly”的文件夹。 这些文件夹中包含相应的脚本。

使用用户特定的 Crontab

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

由于您的 crontab 中的命令将以您的用户权限运行,因此特定于用户的 crontab 中不存在“用户”列。

要查看您当前的 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.