Service tomcat7 start не работает, но процесс существует, и tomcat запущен
Я пытаюсь установить tomcat7 на docker-изображения ubuntu с помощью apt-get install tomcat7
.
Установка отлично работает и запускает tomcat из каталога catalina.sh.
Мне нужно запустить tomcat из "service tomcat7 start", который вместо этого не выполняется.
Независимо от результата сбоя, если я wget localhost:8080
, я могу видеть, что tomcat отвечает, и если я ps -ef | grep tomcat
, я вижу процесс.
Аналогично, если я запускаю service tomcat7 status
, он говорит, что tomcat не работает, даже если он существует, и файл PID существует.
Я заметил, что когда я запускаю tomcat из сценариев каталины, созданный файл pid называется tomcat.pid, но /etc/init.d/tomcat
script попытается прочитать tomcat7. PID.
Однако, заставляя имя в script заглядывать в правый файл pid, не решает проблему.
Кто-нибудь еще испытал это?
Версия файла docker ubuntu, которую я пытаюсь сделать, действительно не актуальна, так как я пытался с несколькими.
В любом случае я использую 12.10 и 14.04.
Спасибо!
Ответы
Ответ 1
В изображении docker Ubuntu я использую (5506de2b643b - 14.04.1 LTS), демон start-stop с аргументом --test
работает некорректно и сообщает, что tomcat не работает, даже если он есть.
Tomcat7 init.d script запускает tomcat, потому что start-stop-daemon --test
говорит (правильно), что tomcat не запущен, но потом немного позже в процессе запуска он проверяет, что tomcat запущен и работает. start-stop-daemon --test
теперь неправильно говорит, что tomcat не запущен, что приводит к тому, что tomcat7 init.d script удаляет файл PID.
В результате service tomcat7 status
возвращает false, когда tomcat запущен, потому что файл PID ушел, но он вернет false, даже если PID файл там с правильным PID из-за ошибки в start-stop-daemon --test
.
Здесь пример сеанса, демонстрирующий ошибку:
#TOMCAT PID IS 43
[email protected]:/# ps -eaf | grep tomcat7
tomcat7 43 1 0 14:06 ? 00:00:04 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
#PID FILE HAS CORRECT PID
[email protected]:/# cat /var/run/tomcat7.pid
43
#START-STOP-DAEMON --TEST REPORTS THAT IT WOULD START TOMCAT
[email protected]:/# start-stop-daemon --test --start --pidfile /var/run/tomcat7.pid --user tomcat7 --exec /usr/lib/jvm/java-7-oracle/bin/java
Would start /usr/lib/jvm/java-7-oracle/bin/java .
[email protected]:/# echo $?
0
Ответ 2
Docker не запускает ни одну из служб ОС, а только команду, указанную в файле Docker или явно в командной строке.
Я понимаю, что service
и связанные с ним команды зависят от процесса init, которого не существует.
Вы должны запустить tomcat явно из сценариев Catalina. Вы можете обернуть это чем-то вроде supervisord, чтобы получить поведение "restart-if-it-crashes".
Ответ 3
Я столкнулся с этим. Я установил его (наконец), добавив JAVA_HOME=/usr/lib/jvm/java-8-oracle
в /etc/default/tomcat7
. По какой-то причине он использовал этот JAVA_HOME
для фактического запуска процесса, но он использовал /usr/lib/jvm/default-java
, чтобы проверить, запущен ли процесс. Это смутило его, поэтому он никогда не обнаруживал, что процесс запущен.
Ответ 4
У меня случается некоторая ситуация, вызванная удалением каталога /var/lib/tomcat7/logs
, где я переделываю каталог, принадлежащий другому пользователю, так что tomcat7
не может перезагрузиться и не записывать выходные данные, я меняю собственный, теперь он отлично работает.
sudo chown tomcat7.tomcat7 /var/log/tomcat7
sudo chown tomcat7.tomcat7 /var/lib/tomcat7/logs