Я настроил необслуживаемые обновления, чтобы установить пакеты защиты и уведомить почтой, когда она делает так.
Я заметил, что установка происходит в очень случайные времена. Я знаю, что последние версии добавили случайную задержку до 30 минут, запускающихся с cron.daily времени выполнения.
Однако задержки, которые я испытываю, намного больше, чем это. Я вижу, что необслуживаемые обновления выполняются в 9:00, 15:00, 12:00... Журналы показывают то же, таким образом, это не просто доставка электронной почты, которая занимает больше времени.
Необслуживаемой задачей обновлений является первая в cron.daily, означая, что нет никакой предыдущей задачи с огромным временем выполнения.
Кто-либо испытал подобную вещь?
После отладки этого я нашел решение.
Первопричина этой проблемы находится в том, что в соответствии с Ubuntu 16.04 и более новый, необслуживаемые обновления используют systemd - не крон - для планирования обновлений с огромной рандомизированной задержкой:
/lib/systemd/system/apt-daily.timer
настроен с
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Это означает, что будет работать два раза в день, в 6:00 и 18:00, со случайной задержкой до 12 часов. Поскольку это не всегда приемлемо для продуктивных сред, я должен был переопределить эти настройки.
Для хранения файлов конфигурации пакета нетронутыми, я определил свое переопределение в /etc/systemd/system/apt-daily.timer.d/override.conf
(Я должен был создать папку и файл).
Там я установил
[Timer]
OnCalendar=
OnCalendar=06:00
RandomizedDelaySec=1h
выполнять необслуживаемые обновления в 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
Официальная debian документация относительно https://wiki.debian.org/UnattendedUpgrades в настоящее время имеет ошибку в нем, которая вводит в заблуждение много людей. Это утверждает, что можно переопределить время обновления путем создания файла, названного
/etc/systemd/system/apt-daily-upgrade.d/override.conf
Однако, корректный путь
/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
Я попробовал решение Daniel, но обновление все еще работало в неправильные времена. Превращенный там два переопределения systemd, которые необходимы:
/lib/systemd/system/apt-daily.timer - переопределяют с/etc/systemd/system/apt-daily.timer.d/override.conf
/lib/systemd/system/apt-daily-upgrade.timer - переопределяют с/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
Лучший способ обновить время автоматического обновления, как я скомпилировал из различных источников и протестировал в нашей системе, — исключительно использовать команды systemctl
и не пытаться найти нужные файлы для редактирования.
Единственное, что вам нужно знать наверняка, это имя сервиса, в нашем случае это apt-daily-upgrade
(если вы не уверены, найдите его через $ systemctl | grep apt
). Когда для службы systemd определен таймер, на него ссылаются как #{имя_службы}.timer
, поэтому для нас это apt-daily-upgrade.timer
.
Поскольку конфигурацию системы изменять не следует, нам придется переопределить конфигурацию таймера по умолчанию в systemd. Для этого вам нужно скопировать и отредактировать некоторые части оригинальной конфигурации, поэтому давайте сначала покажем ее:
$ systemctl cat apt-daily-upgrade.timer
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
Нам нужно обновить значения OnCalendar
и RandomizedDelaySec
в [Таймер]
. Давайте создадим файл конфигурации переопределения с помощью следующей команды:
$ systemctl edit apt-daily-upgrade.timer
Это должно открыть редактор с пустым файлом, и нам нужно поместить туда измененный раздел [Таймер]
, по крайней мере:
[Timer]
# Reset the system calendar config first
OnCalendar=
# Set a new calendar timer with a 60 minute threshold
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m
Как вы Как видите, мы обновили значение OnCalendar
, чтобы запускать автоматические обновления по вечерам, а не по утрам. Пустая строка OnCalendar
над ней должна присутствовать, поскольку данное значение конфигурации является аддитивным, т.е. оно может быть указано более одного раза, и только установка его в пустое значение сбрасывает все предыдущие Значения OnCalendar
(из конфигурации системы).
Сохранив файл, мы можем убедиться, что systemd знает о нем (нет необходимости запускать systemctl daemon-reload
, команда edit
сделает это за нас при выходе из editor):
$ systemd cat apt-daily-upgrade.timer
# /lib/systemd/system/apt-daily-upgrade.timer
[Unit]
Description=Daily apt upgrade and clean activities
After=apt-daily.timer
[Timer]
OnCalendar=*-*-* 6:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf
[Timer]
# Reset the system calendar config first
OnCalendar=
OnCalendar=*-*-* 21:00
RandomizedDelaySec=60m
Теперь он показывает две конфигурации, причем наша пользовательская переопределяет конфигурацию по умолчанию. Хорошо!
Окончательную проверку того, что все работает должным образом, можно выполнить с помощью команды list-timers
команды systemctl
:
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
...
Thu 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
...
Найдите нужную строку в выходных данных и посмотрите на Столбец NEXT
— значение в нем должно отражать время только что настроенного автоматического обновления.