Вопрос или проблема
Недавно из-за уязвимости, обнаруженной в Java, была установлена новая версия пакетов через процедуру автоматических обновлений:
Start-Date: 2024-11-12 06:15:15
Commandline: /usr/bin/unattended-upgrade
Upgrade: openjdk-17-jre:amd64 (17.0.12+7-1ubuntu2~22.04, 17.0.13+11-2ubuntu1~22.04), openjdk-17-jre-headless:amd64 (17.0.12+7-1ubuntu2~22.04, 17.0.13+11-2ubuntu1~22.04)
End-Date: 2024-11-12 06:15:18
больше информации: https://ubuntu.com/security/notices/USN-7098-1
Обновление, похоже, не вызвало никаких проблем, процессы Java продолжали работать, но только поверхностно. Логика кода, вызывающая внешние процессы, начала давать сбои с:
java.io.IOException error=0, Не удалось выполнить вспомогательную программу: pid: 2187894, код завершения: 1.
Для решения проблемы было необходимо перезапустить процесс Java.
Мои вопросы следующие:
Можно ли принудительно перезапускать службы (systemd), которые были установлены через пакеты Debian и имели Java в качестве зависимости? Например, tomcat9
Поможет ли фиксация пакетов предотвратить автоматические обновления этого пакета?
Какую версию Ubuntu вы используете? Ubuntu 24.04 имеет сложную систему сканирования на использование устаревших библиотек и перезапускает любой процесс, использующий заменённую библиотеку. Смотрите объявление о изменениях needrestart в Ubuntu 24.04: перезапусках служб. Это функция, которую я иногда отключаю (закомментировав строку в /etc/apt/apt.conf.d/99needrestart
) из-за её агрессивности.
Смешно то, что я не думаю, что это работает для сред выполнения Java и процессов, которые её используют. Это может потребовать некоторого фактического обсуждения с Ubuntu.
Да, фиксация пакетов действительно удерживает обновления, включая обновления безопасности.
Ответ или решение
Проблема с Unattended Upgrades и Java Процессами
Недавно на вашем сервере возникла проблема после обновления пакетов Java через процедуру unattended-upgrades. Это связано с обновлением версии Java в связи с обнаруженной уязвимостью. В результате обновления, процессы Java продолжали работать, но с определенными сбоями, особенно в тех случаях, когда требовалось взаимодействие с внешними процессами. При этом возникла ошибка:
java.io.IOException error=0, Failed to exec spawn helper: pid: 2187894, exit value: 1.
Устранение Проблемы
Для решения возникшей проблемы потребовалась перезагрузка Java процессов. Данная ситуация открывает несколько дискуссионных вопросов, использование которых зависит от конкретной конфигурации системы.
1. Автоматическая Перезагрузка Служб
На системах с systemd
можно настроить автоматическую перезагрузку служб, которые зависят от обновленных пакетов. Однако стоит учитывать, что в стандартной конфигурации такой функционал не всегда охватывает Java-сервисы, даже если они установлены через deb-пакеты, как, например, tomcat9
.
Поскольку Java-процесс может не быть правильно выявлен системой как требующий перезагрузки, стоит рассмотреть следующие шаги:
-
Использование needrestart: Этот инструмент, начиная с Ubuntu 24.04, автоматически обнаруживает процессы, использующие устаревшие библиотеки, и предлагает их перезагрузить. Однако его способность управлять процессами Java может быть ограничена.
-
Создание юнитов systemd: Вы можете создать собственные юниты для управления запуском и остановкой Java-приложений, добавив следующее в файлы
.service
:[Service] ExecStart=/path/to/java -jar your-app.jar Restart=on-failure
Эти параметры обеспечат автоматическую перезагрузку ваших Java-приложений в случае сбоя.
2. Пиннинг Пакетов
Пакетный пиннинг является эффективным методом контроля обновлений, позволяющим удерживать пакеты от автоматического обновления. Если вы применяете пиннинг к пакету Java, например, с использованием файла /etc/apt/preferences
, это предотвратит как обычные, так и безопасные обновления этого пакета.
Пример конфигурации для пиннинга:
Package: openjdk-17-jre
Pin: version 17.0.12+7-1ubuntu2~22.04
Pin-Priority: 1001
С помощью такой настройки вы можете избежать проблем, связанных с неожиданными обновлениями, однако будьте осторожны: это также может привести к отсутствию критических исправлений безопасности.
Заключение
В вашей ситуации важность правильной конфигурации автоматической перезагрузки Java-процессов, а также осознанного применения пакетного пиннинга не может быть переоценена. Рекомендуется внимательно оценивать риски, связанные с безопасностью, против удобства в управлении службами. Если требуется углубленное изучение возможностей автоматизации перезагрузки при обновлениях, рекомендуется обратиться к документации Ubuntu или соответствующим специализированным сообществам.