了解 anacron 何时在 `/etc/cron.monthly` 运行脚本

了解 anacron 何时在 `/etc/cron.monthly` 运行脚本

我试图理解cron、anacron 和 systemd 一起发挥作用尤其是尝试理解 anacron 如何安排作业/etc/cron.daily/etc/cron.weekly以及/etc/cron.monthly

这是我目前的理解。

  • cron 是一个守护进程。它自己醒来每分钟检查是否必须运行某些脚本
  • anacron 不是守护进程。它由启动脚本或其他调度程序(如 cron 或 systemd 计时器)执行。
  • systemd 是一个实用套件,这些实用程序之一是“计时器”,它允许安排作业

如果 anacron 不存在并且计算机在预期的时间打开,则 cron 将运行以下脚本:

  • /etc/cron.daily每天 6:25
  • /etc/cron.weekly星期日 06:47。
  • /etc/cron.monthly1 月 1 日 06:52

按照以下文件中的配置进行配置crontab大师转换为人类可读的时间。

# /etc/crontab: system-wide crontab

# 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 )

如果计算机关闭或者存在 anacron,cron 将完全忽略这些文件夹。

cron 的其他默认配置是

# /etc/cron.d/anacron: crontab entries for the anacron package

30 7    * * *   root    [ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi

这意味着如果 anacron 存在而 systemd 不存在,则 cron 将每天 7.30 启动 anacron。

如果存在 systemd,其计时器将每小时运行一次 anacron

$ cat ./timers.target.wants/anacron.timer
[Unit]
Description=Trigger anacron every hour

[Timer]
OnCalendar=hourly
RandomizedDelaySec=5m
Persistent=true

[Install]
WantedBy=timers.target

然后,每次执行 anacron 时(systemd 中每小时/重启/唤醒)都会读取其配置文件

# /etc/anacrontab: configuration file for anacron

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

并且对于配置中的每个作业标识符,读取/var/spool/anacron/<job_identifier>记录上次20201201由 anacron 启动作业的时间(即:)。

如果指定的天数已经过去,该作业将再次运行。

/etc/crontab因此,等等中定义的预定时间/etc/cron.daily将完全不会被遵守。

现在问题是:

  • 作业不会在 anacron 执行时准确执行,而是根据以下时间安排启动:anacrontab 的参数START_HOURS_RANGE,和RANDOM_DELAY。这是真的吗?

  • 如果 anacroncron.monthly第一次运行是在 1 月 1 日。2 月 1 日服务器关闭。2 月 2 日服务器开启,作业执行并20200202记录为时间戳。下次执行作业的时间是 3 月 1 日、3 月 2 日还是其他任何一天?为什么?

  • 如果某项工作必须在每个月 5 号执行,或者在下一个可能的时刻(同一天的另一个时间、下次重新启动,甚至第二天)关闭。我考虑了两个选项,但不确定是否有另一个好的选项可以解释,尽量避免安装新东西:

    • 每天执行该作业,并处理“何时”逻辑在剧本本身中
    • 使用 systemd 计时器和启动实用程序

相关内容