我有一台安装了 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"
}}}