如何在 Linux 上使用 anacron 定期运行命令如何在 Linux 上使用 anacron 定期运行命令如何在 Linux 上使用 anacron 定期运行命令如何在 Linux 上使用 anacron 定期运行命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 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 由四列组成,用于按顺序指定:

  1. 工作频率(以天为单位)

  2. 用于作业的延迟(以分钟为单位)

  3. 作业标识符

  4. 要执行的命令

举个例子,看一下最新版本的 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 实例。

©2015-2025 艾丽卡 support@alaica.com