我试图理解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.monthly
1 月 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
。这是真的吗?如果 anacron
cron.monthly
第一次运行是在 1 月 1 日。2 月 1 日服务器关闭。2 月 2 日服务器开启,作业执行并20200202
记录为时间戳。下次执行作业的时间是 3 月 1 日、3 月 2 日还是其他任何一天?为什么?如果某项工作必须在每个月 5 号执行,或者在下一个可能的时刻(同一天的另一个时间、下次重新启动,甚至第二天)关闭。我考虑了两个选项,但不确定是否有另一个好的选项可以解释,尽量避免安装新东西:
- 每天执行该作业,并处理“何时”逻辑在剧本本身中。
- 使用 systemd 计时器和启动实用程序