Cron

来自 阿尔派 Linux

本页面介绍了 Cron 的工作原理,Cron 是类 Unix 操作系统上的作业调度器。Cron 最适合用于调度重复性任务。调度一次性任务可以使用相关的 at 工具完成。Cron 有许多不同的实现,但 Alpine Linux 内置了 BusyBox 版本的 cron。Alpine Linux 中提供的其他软件包包括 croniefcrondcron

对于非持续运行的系统(如笔记本电脑或普通台式计算机),如果系统在 cron 作业的预定时间处于挂起或关机状态,则调用间隔较长的 cron 作业可能根本不会执行。为了解决这个问题,许多 crond 实现提供了特殊的指令,如 @daily@monthly,它们会跟踪上次执行时间,并且即使系统在作业应该运行时处于关闭状态,仍然会执行。

下面提供了如何在不同的 crond 实现中实现此目的的示例。

注意: 每当使用替代的 cron 实现时,请确保来自 BusyBox 的默认 crond 已停止并从 OpenRC 中移除,如下所示:

# rc-service crond stop # rc-update del crond

Cronie

cronie 软件包附带 anacron 工具,它可以进行这种异步作业处理。要使用它,首先安装 cronie 软件包,并配置它在启动时使用 OpenRC 启动。

Anacron

以下是在 Alpine Linux 中使用 anacron 的步骤

  1. 将行 @reboot /usr/sbin/anacron -s 添加到 root 用户的 crontab 中

    # crontab -e

  2. 编辑完成后,当使用命令 # crontab -l 查看或直接查看时,root crontab 应如下所示

    /var/spool/cron/crontabs/root 的内容

    # do daily/weekly/monthly maintenance # min hour day month weekday command */15 * * * * run-parts /etc/periodic/15min 0 * * * * run-parts /etc/periodic/hourly 0 2 * * * run-parts /etc/periodic/daily 0 3 * * 6 run-parts /etc/periodic/weekly 0 5 1 * * run-parts /etc/periodic/monthly @reboot /usr/sbin/anacron -s
  3. Anacron 需要 /var/spool/anacron 文件夹以避免错误 cron.err anacron[2893]: Can't chdir to /var/spool/anacron: No such file or directory。因此,使用以下命令创建文件夹

    # mkdir /var/spool/anacron

  4. 编辑配置文件 /etc/anacrontab 并通过 anacron -T 测试配置的有效性。
  5. 重启计算机以测试 anacron 的工作情况。syslog 文件 /var/log/messages 捕获来自 anacron 的消息,可以使用 cat /var/log/messages |grep anacron 进行搜索。

dcron

另一个可用的 crond,它完全集成了 anacron 的功能,是 dcron,即 “dillon 的轻量级 cron 守护进程”。要使用它,首先安装 dcron 软件包

# apk add dcron

最后,启动 dcron 并告诉 OpenRC 在启动时启动它

# rc-service dcron start # rc-update add dcron

配置

您可以使用 crontab -e 命令将指令添加到 crontab 中,包括 @hourly@daily@weekly@monthly@yearly 指令。

这些特殊指令的语法与 anacron 略有不同。以下是如何调整 Alpine 的默认设置以使用带有特殊指令的 dcron 语法,以确保即使在非持续运行的系统上也能执行它们

/var/spool/cron/crontabs/root 的内容

# do daily/weekly/monthly maintenance # min hour day month weekday command */15 * * * * run-parts /etc/periodic/15min @hourly ID=periodic.hourly run-parts /etc/periodic/hourly @daily ID=periodic.daily run-parts /etc/periodic/daily @weekly ID=periodic.weekly run-parts /etc/periodic/weekly @monthly ID=periodic.monthly run-parts /etc/periodic/monthly

正如您所看到的,作业的名称或 “ID” 以 shell 变量赋值的风格设置。有关 dcron 的选项及其 crontab 格式的更多信息,请查看 crontab(1)crond(8) 手册页,您可以使用 dcron-doc 软件包安装它们。

参见