Ubuntu 16.04:无人值守升级随机运行

dan*_* f. 20 cron unattended-upgrades 16.04

我已经配置了无人值守升级来安装安全包并在安装时通过邮件通知。

我注意到安装发生在非常随机的时间。我知道最新版本从 cron.daily 执行时间开始增加了最多 30 分钟的随机延迟。

然而,我遇到的延迟远不止于此。我看到在上午 9 点、下午 3 点、中午 12 点执行无人值守升级......日志显示相同,因此不仅仅是电子邮件传送需要更长的时间。

无人值守升级任务是 cron.daily 中的第一个,这意味着没有执行时间巨大的先前任务。

有人经历过类似的事情吗?

dan*_* f. 29

经过调试,我找到了解决方案。

此问题的根本原因在于,在 Ubuntu 16.04 及更高版本下,无人值守升级使用 systemd - 而不是 cron - 以巨大的随机延迟来安排更新:

/lib/systemd/system/apt-daily.timer 配置了

OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Run Code Online (Sandbox Code Playgroud)

这意味着它将每天运行两次,分别在 6:00 和 18:00,随机延迟最多 12 小时。由于这对于生产环境来说并不总是可以接受的,我不得不覆盖这些设置。

为了保持包配置文件不变,我在/etc/systemd/system/apt-daily.timer.d/override.conf更新:请阅读此答案底部的编辑以获取有关文件名和位置的更多信息,因为它似乎略有变化)中定义了我的覆盖。

我在那里设置

[Timer]
OnCalendar=
OnCalendar=06:00
RandomizedDelaySec=1h
Run Code Online (Sandbox Code Playgroud)

在 6:00 进行无人值守升级,外加最多一个小时的随机延迟。

然后我简单地重新启动了计时器systemctl restart apt-daily.timer(最终需要重新加载守护程序)。

无人值守更新现在再次在可预测的时间运行!

编辑:对于 Ubuntu 18.04 来说,事情似乎发生了一些变化。覆盖现在应该存储在/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf,看起来像这样:

[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=1h
Run Code Online (Sandbox Code Playgroud)

@PerlDuck 在下面的评论中提到了一种创建具有正确名称和位置的覆盖文件的方法。不要手动创建文件,请考虑运行sudo systemctl edit apt-daily.timer

  • 因为否则它只会在早上 6 点添加一个新的计时器,同时保留现有的计时器。由于我希望无人值守升级仅在 6 点运行,因此我需要先清除计划。 (2认同)
  • @丹尼尔·F。我在 /lib/systemd/system/ 中有一个 apt-daily.timer 文件,在 /etc/systemd/system/timers.target.wants/ 中有一个文件,但是我在 /etc/systemd/system/ 中没有任何文件自己喜欢你。你知道我是否应该在 /lib/systemd/system 下创建 apt-daily.timer.d 目录和 override.conf 吗?感激地记录所有建议与 thx。 (2认同)

小智 12

当我从各种来源编译它并在我们的系统上进行测试时,更新无人值守升级时间的最佳方法是专门使用systemctl命令并避免尝试找到要编辑的正确文件。

\n

您唯一需要确定的是服务名称,在我们的例子中,是apt-daily-upgrade(如果不确定,请通过 搜索$ systemctl | grep apt)。当 systemd 服务定义了计时器时,它被引用为#{service_name}.timer,因此apt-daily-upgrade.timer对我们来说它\xe2\x80\x99s。

\n

由于系统配置不应被编辑,我们\xe2\x80\x99必须覆盖systemd中的默认计时器配置。为此,您需要复制编辑原始配置的某些部分,因此让\xe2\x80\x99s 首先显示它:

\n
$ systemctl cat apt-daily-upgrade.timer \n# /lib/systemd/system/apt-daily-upgrade.timer\n[Unit]\nDescription=Daily apt upgrade and clean activities\nAfter=apt-daily.timer\n\n[Timer]\nOnCalendar=*-*-* 6:00\nRandomizedDelaySec=12h\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n
Run Code Online (Sandbox Code Playgroud)\n

我们\xe2\x80\x99需要更新该部分中的OnCalendarRandomizedDelaySec[Timer]。让\xe2\x80\x99s 通过以下命令创建覆盖配置文件:

\n
$ systemctl edit apt-daily-upgrade.timer\n
Run Code Online (Sandbox Code Playgroud)\n

这应该打开一个带有空白文件的编辑器,我们需要将修改后的[Timer]部分放在那里,至少:

\n
[Timer]\n# Reset the system calendar config first\nOnCalendar=\n# Set a new calendar timer with a 60 minute threshold\nOnCalendar=*-*-* 21:00\nRandomizedDelaySec=60m\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,我们\xe2\x80\x99已更新该OnCalendar值以在晚上(而不是早上)触发自动更新。其OnCalendar上方的空行必须存在,因为此配置值是附加的,即可以多次指定它,并且仅将其设置为空白值会重置所有先前的值。OnCalendar值(来自系统配置的值)。

\n

保存文件后,我们可以通过再次运行上面的命令来验证 systemd 是否知道该文件(无需运行\xe2\x80\x99s systemctl daemon-reload,该edit命令在离开编辑器时为我们执行此操作) :systemctl

\n
$ systemctl cat apt-daily-upgrade.timer\n\n# /lib/systemd/system/apt-daily-upgrade.timer\n[Unit]\nDescription=Daily apt upgrade and clean activities\nAfter=apt-daily.timer\n\n[Timer]\nOnCalendar=*-*-* 6:00\nRandomizedDelaySec=12h\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n\n# /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf\n[Timer]\n# Reset the system calendar config first\nOnCalendar=\nOnCalendar=*-*-* 21:00\nRandomizedDelaySec=60m\n\n
Run Code Online (Sandbox Code Playgroud)\n

现在它显示两种配置,我们的自定义配置会覆盖默认配置。好的!

\n

list-timers最后检查一切是否按预期工作可以通过以下命令完成systemctl

\n
$ systemctl list-timers\nNEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES                     \n...\nThu 2020-08-06 21:51:36 UTC 12h left      Thu 2020-08-06 07:10:20 UTC 2h 20min ago apt-daily-upgrade.timer      apt-daily-upgrade.service               \n...             \n
Run Code Online (Sandbox Code Playgroud)\n

在输出中找到正确的行并查看该NEXT列 - 其中的值应反映新配置的无人值守升级的时间。

\n


Rol*_*ech 9

https://wiki.debian.org/UnattendedUpgrades上的官方 debian 文档目前有一个错误,误导了很多人。它声称您可以通过创建一个名为的文件来覆盖升级时间

/etc/systemd/system/apt-daily-upgrade.d/override.conf
Run Code Online (Sandbox Code Playgroud)

然而正确的路径是

/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
Run Code Online (Sandbox Code Playgroud)

  • 不错的发现。恕我直言,最安全的做法是使用`sudo systemctl edit apt-daily.timer`。这将打开一个带有正确插入文件的编辑器。 (2认同)
  • 谢谢 PerlDuck,我根据你的建议编辑了 Debian Wiki 页面 (2认同)

Nie*_*ask 8

我尝试了 Daniel 的解决方案,但升级仍然在错误的时间运行。原来需要两个 systemd 覆盖:

用于下载

/lib/systemd/system/apt-daily.timer
Run Code Online (Sandbox Code Playgroud)

...被覆盖:

/etc/systemd/system/apt-daily.timer.d/override.conf
Run Code Online (Sandbox Code Playgroud)

用于升级

/lib/systemd/system/apt-daily-upgrade.timer
Run Code Online (Sandbox Code Playgroud)

...被覆盖:

/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
Run Code Online (Sandbox Code Playgroud)