Tomcat: порт занят или служба не останавливается
Tomcat занимает два порта: для запросов и для команды остановки. Оба могут конфликтовать при нескольких экземплярах. Второй частый случай — долгое завершение, из-за которого служба добивается по таймауту.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Порт запросов или порт остановки занят
При двух экземплярах на одной машине конфликтуют оба порта, и второй экземпляр не запускается.
-
Служба не укладывается в таймаут остановки
Завершение приложений с большим состоянием занимает время. При коротком таймауте процесс добивается, и данные могут потеряться.
-
Права на каталоги работы
Tomcat пишет в каталоги журналов, временных файлов и развёртывания. После ручного вмешательства владелец мог измениться.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Кто занимает порты Tomcat.
sudo ss -tlnp | grep -E ":(8080|8005)\s"Журнал сервера приложений.
sudo tail -40 /var/log/tomcat9/catalina.out 2>/dev/nullПараметры остановки службы.
systemctl show tomcat9 -p TimeoutStopSec -p KillMode 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При двух экземплярах на одной машине конфликтуют оба порта, и второй экземпляр не запускается.
- Как проверить
-
Посмотрите владельцев портов.
sudo ss -tlnp | grep -E ":(8080|8005)\s"
- Как исправить
- Задайте каждому экземпляру свои порты в настройках сервера. Порт остановки можно отключить, если он не используется.
- Почему происходит
- Завершение приложений с большим состоянием занимает время. При коротком таймауте процесс добивается, и данные могут потеряться.
- Как проверить
-
Посмотрите таймаут и записи об остановке.
systemctl show tomcat9 -p TimeoutStopSec 2>/dev/null journalctl -u tomcat9 --no-pager | grep -iE "SIGKILL|timed out" | tail
- Как исправить
- Увеличьте таймаут остановки до времени корректного завершения приложений.
- Почему происходит
- Tomcat пишет в каталоги журналов, временных файлов и развёртывания. После ручного вмешательства владелец мог измениться.
- Как проверить
-
Посмотрите владельцев каталогов.
sudo ls -ld /var/lib/tomcat9/{logs,work,webapps} 2>/dev/null
- Как исправить
- Верните владельцем пользователя службы. Каталоги можно объявить через параметры systemd, чтобы права выставлялись автоматически.
Пример вывода
Порт остановки занят вторым экземпляром. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
catalina[4300]: SEVERE [main] StandardServer.await Failed to create server shutdown socket on address [localhost] and port [8005]
catalina[4300]: java.net.BindException: Address already in use
systemd[1]: tomcat9.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- BIND: порт 53 занят systemd-resolved named не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Java-служба не запускается: не найдена среда исполнения Служба на JVM падает с кодом 203 или 127: путь к java неверен или среда исполнения не установлена.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
Источники
- Документация Tomcat
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено двумя экземплярами с одинаковыми портами.