У меня есть машина Ubuntu 10.04 с tomcat6. Когда я запускаю tomcat6 с /etc/init.d/tomcat6 start
я получил
* Starting Tomcat servlet engine tomcat6
/bin/bash already running.
и сервер не запускается. К сожалению, в /var/log/tomcat/catalina.out чтобы помочь отладить проблему. С некоторыми умно размещенными эхо-операторами кажется, что это строка из /etc/init.d/tomcat6:
start-stop-daemon --start -u "$TOMCAT6_USER" -g "$TOMCAT6_GROUP" \
-c "$TOMCAT6_USER" -d "$CATALINA_TMPDIR" \
-x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
Единственное, что я изменил в этом скрипте, это TOMCAT6_USER=root
. В server.xml я изменил только <Connector port="80" protocol="HTTP/1.1"
с порта 8080. Я попытался переустановить пакет, сначала удалив все sudo apt-get --purge remove tomacat6
а потом sudo apt-get install tomcat6
но это не решило проблему. Я также перезапускал сервер несколько раз в надежде на волшебство. Все работало, пока я не перезапустил свой сервер. Любые идеи?
Есть ошибка Ubuntu для этой проблемы с предлагаемым патчем.
Это не обязательно связано с запуском от имени root - если у вашего пользователя tomcat6 есть процесс / bin / bash (скажем, вы используете его для запуска некоторых команд для поддержки вашего приложения Tomcat), тогда вы также попадете в него.
Иногда ты должен делать то, что должен.
Вот патч, который заставляет работать Tomcat как root:
--- init.d.old/tomcat6 2010-09-01 15:31:01.996208252 -0700
+++ init.d/tomcat6 2010-09-01 15:30:10.315146226 -0700
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/sh -x
#
# /etc/init.d/tomcat6 -- startup script for the Tomcat 6 servlet engine
#
@@ -141,6 +141,12 @@
cd \"$CATALINA_BASE\"; \
\"$CATALINA_SH\" $@"
+ cat >/etc/init.d/tomcat_exec.sh <<-EOT
+ #!/bin/bash
+ $TOMCAT_SH
+ EOT
+ chmod +x /etc/init.d/tomcat_exec.sh
+
if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
TOMCAT_SH="'$TOMCAT_SH'"
fi
@@ -151,7 +157,7 @@
chown $TOMCAT6_USER "$CATALINA_PID" "$CATALINA_BASE"/logs/catalina.out
start-stop-daemon --start -u "$TOMCAT6_USER" -g "$TOMCAT6_GROUP" \
-c "$TOMCAT6_USER" -d "$CATALINA_TMPDIR" \
- -x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
+ -x /etc/init.d/tomcat_exec.sh
status="$?"
set +a -e
return $status
Это (была) известная ошибка Ubuntu, которая с тех пор исправлена: https://bugs.launchpad.net/ubuntu/+source/tomcat6/+bug/632554
Сценарий инициализации не запустит демон tomcat6, если у пользователя запущена оболочка bash.
Исправление, указанное в отчете об ошибке, заключается в простом добавлении -p "$CATALINA_PID"
к команде start-stop-daemon.
*** tomcat6~ 2010-10-11 13:21:52.000000000 -0500
--- tomcat6 2010-11-03 12:19:04.000000000 -0500
***************
*** 152,154 ****
start-stop-daemon --start -b -u "$TOMCAT6_USER" -g "$TOMCAT6_GROUP" \
! -c "$TOMCAT6_USER" -d "$CATALINA_TMPDIR" \
-x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
--- 152,154 ----
start-stop-daemon --start -b -u "$TOMCAT6_USER" -g "$TOMCAT6_GROUP" \
! -c "$TOMCAT6_USER" -d "$CATALINA_TMPDIR" -p "$CATALINA_PID" \
-x /bin/bash -- -c "$AUTHBIND_COMMAND $TOMCAT_SH"
}}}
Глядя на страницу руководства для start-stop-daemon, он ищет процессы, которые соответствуют имени, uid и / или gid команды, которую его просят запустить. Судя по сообщению об ошибке, я предполагаю, что это может быть сделано на основе команды / bin / bash, поэтому он обнаруживает, что уже существует корневой процесс, выполняющий команду / bin / bash, и отказывается запускать «дублирующий».
Вы можете обойти это, взломав сценарий инициализации. Но запуск Tomcat от имени root - это плохо, поэтому лучше рассмотреть другие способы отправки порта 80 на Tomcat, даже если Tomcat работает как пользователь без полномочий root. Наиболее распространенный подход - запустить Apache httpd впереди, другой (если вы не хотите возиться с коннекторами) - использовать iptables для сопоставления порта 80.
Увидеть serverfault вопрос для получения подробной информации о том, как это сделать.