У меня есть 9 экземпляров tomcat (с apache и mod_jk) на коробке, которые начинаются с /etc/init.d/tomcatX
скрипты (где X - число [1-9]). Эти скрипты просты:
#!/bin/sh
### BEGIN INIT INFO
# Required-Start: mysql
### END INIT INFO
case "$1" in
'start')
/usr/local/tomcat5/bin/startup.sh
touch /var/lock/subsys/tomcat5
;;
'stop')
/usr/local/tomcat5/bin/shutdown.sh
rm -f /var/lock/subsys/tomcat5
;;
*)
echo "Usage: $0 { start | stop }"
;;
esac
exit 0
Эти службы запускаются при перезагрузке сервера:
> chkconfig -l
...
tomcat1 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat2 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat3 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat4 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat5 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat6 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat7 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat8 0:off 1:off 2:off 3:on 4:off 5:on 6:off
tomcat9 0:off 1:off 2:off 3:on 4:off 5:on 6:off
Проблема в том, что иногда (что бывает довольно редко, случайным и невоспроизводимым) один из котов не запускается, потому что его AJP
порт уже будет занят:
May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init
INFO: Port busy 8015 java.net.BindException: Address already in use
May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init
SEVERE: Can't find free port 8015 8015
Таким образом, он продолжит процесс запуска и запустит все свои веб-приложения, но, к сожалению, они никогда не смогут получить какой-либо HTTP-запрос.
Соответствующая конфигурация:
<Connector port="8015" protocol="AJP/1.3" ... />
Что может быть причиной? 8015 больше нечего слушать.
Я надеюсь, что вы используете уникальный номер порта в порту ajp для каждого из 9 экземпляров tomcat. Я имею в виду это:
<Connector port="abcd" protocol="AJP/1.3" ... />
Я имею в виду, что abcd отличается для каждого из 9 экземпляров tomcat. это также может быть связано с тем, что порт использует какая-то другая программа. Скорее всего, вы используете базу данных в своем приложении, которая может содержать порт. Я имею ввиду клиентскую сторону БД. Вы можете увидеть, какая программа удерживает порт, через netstat или ss. Выполните следующие действия от имени привилегированного пользователя, чтобы узнать, какая программа удерживает порт:
sudo netstat -antp| grep <port number reported in use>
На выходе вы увидите pid (идентификатор процесса). Затем сделайте следующее
ps -ef| grep <pid from above>
То же самое можно сделать и с командой ss, которая, по их словам, более эффективна. Google или справочные страницы, чтобы узнать, как получить то же самое с ss. Использовать ss очень просто.