Назад | Перейти на главную страницу

Исправить сообщение об ошибке tomcat6 «/ bin / bash уже запущено» при запуске tomcat?

У меня есть машина 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 вопрос для получения подробной информации о том, как это сделать.