如何在 Linux 上使用 anacron 定期运行命令
当我们需要在 Linux 系统上安排任务时,我们可以使用 cron 或 systemd-timers 等实用程序。 cron 存在各种实现,但它们的共同点是它们作为系统服务运行,并且设计用于始终启动和运行的系统(例如服务器)。当我们需要在经常关闭的台式机或笔记本上安排任务时,我们可以使用 anacron 来代替。
在本文中,我们将了解什么是 anacron、anacron 和 cron 之间的区别以及如何使用 anacron 在 Linux 上调度命令。
在本教程中您将学习:
如何在一些最常用的 Linux 发行版上安装 anacron
什么是 anacron 以及 anacron 和 cron 之间的区别是什么
anacrontab 的结构如何
如何以非特权用户身份运行 anacron
安装
Anacron(和 cron)通常默认安装在每个 Linux 发行版上,但是,如果出于某种原因我们需要显式安装它们,我们可以使用以下命令。在 Fedora 和 RHEL 系列的其他发行版上,我们使用 dnf 包管理器来执行“cronie”和“cronie-anacron”包的安装(cronie 是使用的 cron 实现)在这些分布上):
$ sudo dnf install cronie cronie-anacron
在 Debian 和其他基于 Debian 的发行版上,要执行相同的操作,我们使用以下命令:
$ sudo apt install anacron cron
在 Archlinux 上,默认情况下不会安装 cron 和 anacron,因为该发行版使用 systemd-timers 作为调度任务的默认方法。然而,安装软件包只需启动 Pacman 软件包管理器,发出以下命令即可:
$ sudo pacman -Sy cronie
Anacron 与 Cron
那么,anacron 和 cron 之间的主要区别是什么?首先,cron 作为守护进程运行:它在后台运行,旨在在持续运行的系统上安排作业。使用 cron,我们可以以分钟为单位微调作业执行时间。另一方面,Anacron 不是守护进程,而是一个旨在直接调用的命令:在台式机或笔记本电脑上安排作业非常有用,这些机器不能保证始终启动并运行。有了它,我们可以安排每天最多运行一次的作业。
anacron 的工作原理
Anacron 基本上是这样工作的:启动时,它会读取anacrontab中安排的作业,这对于 anacron 来说就像 crontab 对于 cron 一样。它检查每个作业的频率(以天为单位),并检查该作业是否已在指定的天数内执行:这是通过将作业时间戳存储在所谓的 spooldir 中来完成的,默认情况下,它是/var/spool/anacron
。如果作业在指定天数内未启动(例如,机器已关闭),则会在一定的延迟分钟后执行该作业。
正如我们之前所说,anacron 不是守护进程,因此必须将其作为命令调用。在绝大多数情况下,anacron 的调用是通过 cron 安排的,每小时一次。例如,在 Fedora 上,anacron 是通过 /etc/cron.hourly/0anacron 脚本调用的。
anacrontab
anacrontab 结构与经典的 crontab 不同。 cron 使用的默认 anacrontab 通常是 /etc/anacrontab
,但正如我们将在本文后面看到的,启动 anacron 时可以指定其他。 anacrontab 由四列组成,用于按顺序指定:
工作频率(以天为单位)
用于作业的延迟(以分钟为单位)
作业标识符
要执行的命令
举个例子,看一下最新版本的 Fedora 上默认的 anacrontab 的内容:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
正如我们所看到的,除了作业规范之外,anacrontab 还包含一些环境变量。 SHELL 和 PATH 变量非常不言自明:它们分别标识应将哪个 shell 用作解释器以及要使用的 PATH。
MAILTO 变量用于指定包含命令输出的邮件必须发送到的邮件地址(默认是将电子邮件发送到 anacrontab 的所有者,在本例中为 root)。为此,必须在系统上配置诸如 sendmail 之类的服务。要禁用此功能,我们只需为变量分配一个空值(例如 MAILTO
=””)。
RANDOM_DELAY 变量指定随机添加到每个作业延迟的最大分钟数;要禁用此功能,我们只需将值设置为 0 即可。最后,START_HOURS_RANGE 变量用于定义允许运行作业的小时间隔。在这里,我们应该选择确定机器将打开的时间范围。
让我们看看职位是如何指定的。在第一列中,正如我们已经看到的,我们可以找到每个作业的执行频率,指定以天为单位。这里我们可以直接使用整数,也可以使用像@daily
、@weekly
或@monthly
这样的宏。
第二列包含作业要使用的延迟,指定以分钟为单位。当调用 anacron 并决定应该运行该命令时,会应用延迟。
第三列包含用于引用日志文件中的任务的标识符。最后,第四也是最后一列包含应执行的命令。这可以是直接命令,也可以是脚本的路径。
如何以非特权用户身份使用 anacron 安排作业
正如我们在本教程中已经提到的,使用 anacron 调度的命令以 root 身份执行,并在系统 anacrontab 中定义,即 /etc/anacrontab
。相反,作业时间戳存储在 /var/spool/anacron
目录中。为了能够以非特权用户身份使用 anacron,我们需要创建这些文件的每个用户等效项。我们的作业计划将保存到 ~/.local/etc/anacrontab
目录中,我们将创建并使用 ~/.local/var/spool/anacron
存储其中定义的作业时间戳的目录:
$ mkdir -p ~/.local/var/spool/anacron
作为简写,我们可以将系统 anacrontab 复制到本地并根据需要进行修改:
$ mkdir -p ~/.local/etc && cp /etc/anacrontab ~/.local/etc
我们可能想要更改 anacrontab 中包含的某些变量的值,例如 MAILTO
的值。我们现在可以在本地 anacrontab 中定义我们的作业计划。最后一步,我们需要确保每小时调用 anacron。为了完成任务,我们可以在本地 crontab 中创建一个条目。要编辑本地 crontab,我们运行以下命令:
$ crontab -e
一旦我们运行上面的命令,我们的个人 crontab 就会使用我们的默认文本编辑器打开。要在每小时开始时运行 anacron,我们在其中添加以下行:
0 * * * * /usr/sbin/anacron -s -t "${HOME}/.local/etc/anacrontab" -S "${HOME}/.local/var/spool/anacron"
在条目中,我们使用 -s
选项调用 anacron,以便计划的作业一个接一个地按顺序运行。为了指定我们想要用作 anacrontab 的文件,我们使用 -t
选项并将文件的路径作为参数传递。最后,我们使用 -S 选项指定用于存储作业时间戳的目录。
结论
在本教程中,我们学习了如何使用 anacron 在系统上安排作业,与服务器不同,系统不能保证始终运行。我们简要了解了 anacron 和 cron 之间的差异、如何在一些最常用的 Linux 发行版上安装 anacron、anacron 的工作原理以及 anacrontab 的组织方式。最后,我们了解了如何实现非特权、每用户 anacron 实例。