修复启动 tomcat 时出现 tomcat6 错误消息“/bin/bash 已在运行”?

修复启动 tomcat 时出现 tomcat6 错误消息“/bin/bash 已在运行”?

我有一台安装了 tomcat6 的 Ubuntu 10.04 机器。当我使用以下代码启动 tomcat6 时,/etc/init.d/tomcat6 start我得到了

* Starting Tomcat servlet engine tomcat6
/bin/bash already running.

并且服务器无法启动。不幸的是,/var/log/tomcat/catalina.out以帮助调试问题。通过巧妙放置一些 echo 语句,它似乎是来自 /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。在 servers.xml 中,我唯一更改的是<Connector port="80" protocol="HTTP/1.1"端口 8080。我尝试重新安装该包,首先删除所有内容sudo apt-get --purge remove tomacat6,然后sudo apt-get install tomcat6,但这并没有解决问题。我还多次重启服务器,希望能够产生一些奇迹。在我重启服务器之前,一切都正常。有什么想法吗?

答案1

有时候你必须做你必须做的事。

这是一个补丁,可以使 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

答案2

Ubuntu 的一个错误针对此问题,提出了一个补丁。

这不一定与以 root 身份运行有关 - 如果您的 tomcat6 用户有一个 /bin/bash 进程(比如,您正在使用它来运行一些命令来支持您的 Tomcat 应用程序),那么您也会遇到它。

答案3

查看 start-stop-daemon 的手册页,它会查找与要求启动的命令的名称、uid 和/或 gid 匹配的进程。从错误消息来看,我猜它可能是根据 /bin/bash 命令执行此操作的 - 因此它发现已经有一个 root 进程正在运行 /bin/bash 命令,并拒绝启动“重复”的进程。

您可以通过修改 init 脚本来解决这个问题。但是以 root 身份运行 Tomcat 是不好的,因此最好寻找其他方法将端口 80 发送到 Tomcat,即使 Tomcat 以非 root 用户身份运行。最常见的方法是在前面运行 Apache httpd,另一种方法(如果您不想摆弄连接器)是使用 iptables 映射端口 80。

查看serverfault 问题了解有关如何执行这些操作的详细信息。

答案4

这是一个已知的 Ubuntu 错误,现已修复:https://bugs.launchpad.net/ubuntu/+source/tomcat6/+bug/632554

如果用户正在运行 bash shell,则 init 脚本将不会启动 tomcat6 守护进程。

错误报告中列出的修复只是添加-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"
}}}

相关内容