Подтвердить что ты не робот

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.

Спасибо!

4b9b3361

Ответ 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