Вопрос или проблема
У меня есть приложение dotnet, работающее как сервис systemd на Ubuntu 24.04.1 LTS, сервис перезапускается, когда выполняется ежедневное обновление apt.
Как предотвратить остановку myapp.service из-за ненаблюдаемых обновлений, или по крайней мере перенести перезапуск сервиса на другое время “например, в полночь”.
Если это невозможно, как добавить dotnet в Unattended-Upgrade::Package-Blacklist {}? Нужно ли добавлять myApp.service или dotnet?
Или есть какое-то другое решение?
Юнит сервиса находится по адресу /etc/systemd/system/MyApp.service
[Unit]
Description=MyApp
Wants=network-online.target
After=network-online.target
[Service]
WorkingDirectory=/home/ubuntu/service
ExecStart=/usr/bin/dotnet /home/ubuntu/service/MyApp.dll
Restart=always
RestartSec=30
TimeoutStartSec=20
TimeoutStopSec=30
SyslogIdentifier=MyApp
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
syslog
2024-10-16T06:20:04.769200+02:00 ip-172-31-30-211 systemd[1]: Начинаю sysstat-collect.service - инструмент учета системной активности...
2024-10-16T06:20:04.781275+02:00 ip-172-31-30-211 systemd[1]: sysstat-collect.service: успешно деактивировано.
2024-10-16T06:20:04.781660+02:00 ip-172-31-30-211 systemd[1]: Завершено sysstat-collect.service - инструмент учета системной активности.
2024-10-16T06:23:04.774362+02:00 ip-172-31-30-211 systemd[1]: Начинаю apt-daily-upgrade.service - Дневные обновления apt и очищение...
2024-10-16T06:23:19.924785+02:00 ip-172-31-30-211 apt.systemd.daily[654047]: /usr/bin/unattended-upgrade:567: DeprecationWarning: Этот процесс (pid=654047) много поточный, использование fork() может привести к взаимным блокировкам в дочернем процессе.
2024-10-16T06:23:19.924930+02:00 ip-172-31-30-211 apt.systemd.daily[654047]: pid = os.fork()
2024-10-16T06:23:22.742954+02:00 ip-172-31-30-211 dbus-daemon[534]: [system] Активирую через systemd: имя сервиса="org.freedesktop.PackageKit" юнит="packagekit.service" запрошен ':1.2486' (uid=0 pid=654235 comm="/usr/bin/gdbus call --system --dest org.freedeskto" метка="unconfined")
2024-10-16T06:23:22.752989+02:00 ip-172-31-30-211 systemd[1]: Начинаю packagekit.service - Демон PackageKit...
2024-10-16T06:23:22.758190+02:00 ip-172-31-30-211 PackageKit: демонт старт
2024-10-16T06:23:22.783550+02:00 ip-172-31-30-211 dbus-daemon[534]: [system] Успешно активирован сервис 'org.freedesktop.PackageKit'
2024-10-16T06:23:22.784390+02:00 ip-172-31-30-211 systemd[1]: Запущен packagekit.service - Демон PackageKit.
2024-10-16T06:23:25.863795+02:00 ip-172-31-30-211 apt.systemd.daily[654047]: /usr/bin/unattended-upgrade:567: DeprecationWarning: Этот процесс (pid=654047) много поточный, использование fork() может привести к взаимным блокировкам в дочернем процессе.
2024-10-16T06:23:25.863997+02:00 ip-172-31-30-211 apt.systemd.daily[654047]: pid = os.fork()
2024-10-16T06:23:29.442594+02:00 ip-172-31-30-211 multipathd[182]: multipathd: выключен
2024-10-16T06:23:29.443034+02:00 ip-172-31-30-211 systemd[1]: Остановка multipathd.service - Контроллер устройства Device-Mapper Multipath...
2024-10-16T06:23:29.447126+02:00 ip-172-31-30-211 systemd[1]: Остановка packagekit.service - Демон PackageKit...
2024-10-16T06:23:29.449508+02:00 ip-172-31-30-211 systemd[1]: packagekit.service: успешно деактивировано.
2024-10-16T06:23:29.450843+02:00 ip-172-31-30-211 systemd[1]: Остановка packagekit.service - Демон PackageKit.
2024-10-16T06:23:29.465607+02:00 ip-172-31-30-211 systemd[1]: Начинаю packagekit.service - Демон PackageKit...
2024-10-16T06:23:29.467615+02:00 ip-172-31-30-211 systemd[1]: Остановка MyApp - CustomApp...
2024-10-16T06:23:29.469369+02:00 ip-172-31-30-211 systemd[1]: multipathd.service: успешно деактивировано.
2024-10-16T06:23:29.471897+02:00 ip-172-31-30-211 systemd[1]: Остановка multipathd.service - Контроллер устройства Device-Mapper Multipath.
2024-10-16T06:23:29.472326+02:00 ip-172-31-30-211 systemd[1]: multipathd.service: использовано 4мин 23.662с времени ЦП, пик памяти 21.9М, пик обмена памяти 0B.
2024-10-16T06:23:29.476193+02:00 ip-172-31-30-211 dotnet-App[645518]: Приложение завершается...
2024-10-16T06:23:29.484613+02:00 ip-172-31-30-211 PackageKit: демонт старт
2024-10-16T06:23:29.484753+02:00 ip-172-31-30-211 systemd[1]: Начинаю multipathd.service - Контроллер устройства Device-Mapper Multipath...
2024-10-16T06:23:29.545792+02:00 ip-172-31-30-211 systemd[1]: Запущен packagekit.service - Демон PackageKit.
2024-10-16T06:23:29.564135+02:00 ip-172-31-30-211 multipathd[654553]: multipathd v0.9.4: запуск
2024-10-16T06:23:29.570545+02:00 ip-172-31-30-211 multipathd[654553]: перенастройка: настройка путей и карт
2024-10-16T06:23:29.578924+02:00 ip-172-31-30-211 systemd[1]: Запущен multipathd.service - Контроллер устройства Device-Mapper Multipath.
2024-10-16T06:23:29.837531+02:00 ip-172-31-30-211 systemd[1]: MyApp: успешно деактивировано.
2024-10-16T06:23:29.838138+02:00 ip-172-31-30-211 systemd[1]: Остановка MyApp - CustomApp.
2024-10-16T06:23:29.838276+02:00 ip-172-31-30-211 systemd[1]: MyApp: использовано 9мин 3.393с времени ЦП, пик памяти 518.3М, пик обмена памяти 0B.
2024-10-16T06:23:29.846979+02:00 ip-172-31-30-211 systemd[1]: Запущен MyApp - CustomApp.
вывод команды “systemctl status myapp.service”
● MyApp.service - Приложение
Loaded: загружено (/etc/systemd/system/myApp.service; включено; предустановка: включено)
Active: активен (работает) с вт 2024-10-22 09:47:19 CEST; 2ч 22мин назад
Main PID: 1957 (dotnet)
Tasks: 43 (лимит: 9367)
Memory: 645.8M (пик: 658.5M)
CPU: 2мин 17.923с
CGroup: /system.slice/myApp.service
└─1957 /usr/bin/dotnet /home/ubuntu/service/MyApp.dll
22 окт 09:47:28 ip-172-31-30-211 dotnet-App[1957]: Теперь слушает на: http://[::]:xx
22 окт 09:47:28 ip-172-31-30-211 dotnet-App[1957]: Теперь слушает на: http://[::]:xx
22 окт 09:47:28 ip-172-31-30-211 dotnet-App[1957]: Приложение запущено. Нажмите Ctrl+C, чтобы завершить.
Ответ или решение
Чтобы предотвратить перезапуск вашего сервиса systemd (myapp.service
) во время автоматических обновлений системы (apt daily update
) на Ubuntu 24.04.1 LTS, рассмотрим несколько подходов и решений, которые помогут вам достичь этой цели.
1. Изменение конфигурации сервиса
Чтобы предотвратить остановку вашего сервиса при выполнении unattended-upgrades
, можно использовать опции в конфигурации самого сервиса. Откройте файл /etc/systemd/system/MyApp.service
и добавьте директиву, которая укажет системе не перезапускать сервис в случае обновлений:
[Unit]
Description=MyApp
Wants=network-online.target
After=network-online.target
[Service]
WorkingDirectory=/home/ubuntu/service
ExecStart=/usr/bin/dotnet /home/ubuntu/service/MyApp.dll
Restart=always
RestartSec=30
TimeoutStartSec=20
TimeoutStopSec=30
SyslogIdentifier=MyApp
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
# Добавьте эту строку
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Эта директива изолирует временные файлы, улучшая стабильность сервиса при выполнении фоновых процессов, таких как обновления.
2. Использование механизмов задержки
Если вы хотите, чтобы перезапуск сервиса происходил в другое время, например, в полночь, вы можете использовать cron
или systemd timer
. Создайте файл таймера для myapp.service
:
# /etc/systemd/system/myapp.timer
[Unit]
Description=Timer for MyApp service
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Затем создайте сам сервис:
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp
[Service]
Type=simple
ExecStart=/usr/bin/dotnet /home/ubuntu/service/MyApp.dll
[Install]
WantedBy=multi-user.target
После этого активируйте таймер с помощью команд:
sudo systemctl enable myapp.timer
sudo systemctl start myapp.timer
Этот подход изменит время выполнения вашего сервиса на заранее запланированное время.
3. Исключение вашего приложения из обновлений
Если предусмотренные механизмы не подходят, вы можете добавить ваше приложение или его зависимости в черный список unattended-upgrades
. Для этого откройте файл конфигурации /etc/apt/apt.conf.d/50unattended-upgrades
и добавьте:
Unattended-Upgrade::Package-Blacklist {
"myapp"; # Замените на имя пакета вашего приложения
};
Обратите внимание, что в черный список добавляется именно имя пакета, а не название сервиса.
4. Дополнительные меры
-
Также будьте внимательны к зависимостям вашего приложения. Если ваше приложение зависит от библиотек или пакетов, которые могут обновляться, они могут вызвать остановку вашего сервиса. Если возможно, рассматривайте использование "замороженных" версий этих пакетов.
-
Постоянно мониторьте журналы (
journalctl -u MyApp.service
), чтобы отслеживать, в какое время и при каких условиях ваш сервис останавливается.
Заключение
Существует несколько путей предотвращения перезапуска вашего dotnet-приложения во время ежедневного обновления системы. Каждый из предложенных методов имеет свои преимущества и может быть настроен в зависимости от ваших конкретных требований. Выбирайте подходящий метод в зависимости от ваших нужд и архитектуры приложения.