Вопрос или проблема
Есть один конкретный сервер, на котором Apache Tomcat ведет себя по-другому.
Сервис был запущен путем выполнения ./startup.sh
из его директории.
На других серверах Tomcat продолжает работать, даже если пользователь выходит из системы.
Но на этом конкретном сервере, когда пользователь выходит из системы, Tomcat также останавливается.
В чем может быть причина такого различия в поведении?
ОС – RHEL 8.
Systemd по умолчанию останавливает все оставшиеся процессы пользователя, когда этот пользователь выходит из всех сессий (это отслеживается в loginctl
). Некоторые дистрибутивы Linux отключают эту функцию, другие оставляют включенной. Это также может быть отключено для всех пользователей через logind.conf(5) на каждой системе, или отдельные пользователи могут отказаться от этого, установив флаг ‘linger’ (документировано на той же странице руководства logind.conf).
Идея этой функции заключается в том, что ручные оболочечные скрипты не являются хорошей системой управления сервисами, и следует запускать сервисы через менеджер сервисов, который способен их контролировать и перезапускать – например, через сам systemd, написав /etc/systemd/system/my-tomcat.service
, который запускает необходимые процессы.
Ответ или решение
Когда вы сталкиваетесь с проблемой, когда Apache Tomcat прекращает свою работу после выхода пользователя из системы на сервере с установленной операционной системой RHEL 8, следует обратить внимание на ряд факторов, которые могут объяснить такое поведение.
1. Поведение системного менеджера Systemd
В современных дистрибутивах Linux, включая RHEL 8, используется системный менеджер systemd. В его настройках по умолчанию предусмотрено, что все процессы, запущенные пользователем, будут остановлены при выходе этого пользователя из системы. Это так называемая функция "user service". Если Tomcat был запущен через скрипт ./startup.sh
в пользовательской сессии, то при выходе из неё процесс Tomcat может быть завершён, поскольку он не отвязан от управления сессией.
2. Настройка конфигурации logind
Для управления поведением при выходе пользователя можно использовать файл конфигурации logind.conf
, в котором существуют параметры, способные влиять на работу пользовательских процессов. Рекомендуется проверить следующие параметры:
- UserStopDelay – Задержка перед остановкой процессов пользователя.
- Linger – Позволяет поддерживать сессии пользователя активными после его выхода.
Параметр linger может быть установлен для конкретного пользователя, что позволит ему оставаться в системе даже после выхода из сессии. Используйте команду:
loginctl enable-linger имя_пользователя
3. Рекомендуемое решение: Запуск Tomcat как системного сервиса
Рекомендуется запускать Apache Tomcat в виде системного сервиса через systemd. Это обеспечит более надежное управление жизненным циклом приложения. Вам понадобится создать файл службы для Tomcat. Вот пример содержания /etc/systemd/system/my-tomcat.service
:
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=simple
User=имя_пользователя
Group=группа_пользователя
Environment=JAVA_HOME=/путь/к/java
Environment=CATALINA_HOME=/путь/к/tomcat
ExecStart=/путь/к/tomcat/bin/startup.sh
ExecStop=/путь/к/tomcat/bin/shutdown.sh
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
После создания файла, активируйте сервис:
systemctl daemon-reload
systemctl enable my-tomcat.service
systemctl start my-tomcat.service
4. Заключение
Итак, основная причина, по которой Apache Tomcat останавливается при выходе пользователя, связана с особенностями управления процессами системой. Для достижения оптимальных результатов рекомендуется использовать systemd для запуска приложений, поскольку это предоставляет более высокий уровень контроля и управления, а также позволяет избежать проблем, связанных с зависимостями процессов от пользовательских сессий.
Переход на использование системных служб обеспечит долгосрочную стабильность и надежность вашего сервера Tomcat.