Ubuntu 16.04: Unattended-upgrades запускается в случайное время

Ubuntu 16.04: Unattended-upgrades запускается в случайное время

Я настроил функцию unattended-upgrades на установку пакетов безопасности и уведомление по почте о каждом таком обновлении.

Я заметил, что установка происходит в очень случайное время. Я знаю, что в последних версиях добавлена ​​случайная задержка до 30 минут, начиная с времени выполнения cron.daily.

Однако задержки, которые я испытываю, гораздо больше. Я вижу, что неконтролируемые обновления выполняются в 9 утра, 3 дня, 12 ночи... Журналы показывают то же самое, так что не только доставка электронной почты занимает больше времени.

Задача автоматического обновления является первой в cron.daily, что означает отсутствие предыдущей задачи с большим временем выполнения.

Кто-нибудь сталкивался с чем-то подобным?

решение1

После отладки я нашел решение.

Основная причина этой проблемы заключается в том, что в Ubuntu 16.04 и более поздних версиях unattended-upgrades использует systemd, а не cron, для планирования обновлений с огромной случайной задержкой:

/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

@PerlDuck упомянул способ создания файла переопределения с правильным именем и местоположением в комментарии ниже. Вместо того, чтобы вручную создавать файл, пожалуйста, рассмотрите возможность запускаsudo systemctl edit apt-daily.timer

решение2

Лучший способ обновить время автоматического обновления, который я собрал из разных источников и протестировал на нашей системе, — этоиспользуйте исключительно systemctlкомандыи избегайте попыток найти нужные файлы для редактирования.

Единственное, что вам нужно знать наверняка, это название сервиса, которое в нашем случаеapt-daily-upgrade(если не уверены, найдите его через $ systemctl | grep apt). Когда у службы systemd определен таймер, он обозначается как #{service_name}.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в [Timer]разделе. Давайте создадим файл конфигурации переопределения с помощью следующей команды:

$ systemctl edit apt-daily-upgrade.timer

Это должно открыть редактор с пустым файлом, и нам нужно поместить туда измененный [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команда сделает это за нас при выходе из редактора), выполнив команду systemctlеще раз, как указано выше:

$ 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

# /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столбец — значение в нем должно отражать время вашего недавно настроенного автоматического обновления.

решение3

Официальная документация 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

решение4

Theapt-daily.таймернастроен на запуск дважды в день и не будет прерывать производственную среду, поскольку он просто обновляет и загружает пакеты, которые необходимо обновить. Вам нужно будет только переопределитьapt-daily-upgrade.таймерна время, которое с меньшей вероятностью повлияет на вашу производственную среду, поскольку это время фактической установки обновлений. Кроме того, есть настройка перезагрузки для вещей, которые требуют этого в 50unattended-upgrades, которую вы должны рассмотреть, чтобы она действительно была применена, и которая также имеет таймер. Кроме того, с 22.04 таймер обновления был изменен на 6 утра + 1 час по умолчанию, поэтому большинству не нужно будет менять это.

Связанный контент