我有一台Ubuntu 10.04机器,它上面有tomcat6。 当我用/etc/init.d/tomcat6 start tomcat6时/etc/init.d/tomcat6 start
* Starting Tomcat servlet engine tomcat6 /bin/bash already running.
并且服务器无法启动。 不幸的是,在/var/log/tomcat/catalina.out中没有任何东西可以帮助debugging这个问题。 使用一些巧妙摆放的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中,我唯一改变的是来自端口8080的<Connector port="80" protocol="HTTP/1.1" 。我已经尝试通过首先删除所有东西来重新安装包sudo apt-get --purge remove tomacat6然后sudo apt-get install tomcat6但是这并没有解决这个问题。 我也重新启动了服务器多次希望有一些魔术。 一切工作,直到我重新启动我的服务器。 有任何想法吗?
有时你必须做你必须做的。
下面是一个使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的bug ,提供了一个补丁。
如果你的tomcat6用户有一个/ bin / bash进程(比如说你正在使用它来运行一些命令来支持你的Tomcat应用程序),那么你就不会有这个问题。
查看start-stop-daemon的手册页,它会查找与要求启动的命令的名称,uid和/或gid匹配的进程。 从错误信息中,我猜可能是基于/ bin / bash命令做到这一点 – 所以它发现已经有一个root进程运行/ bin / bash命令,并拒绝启动“重复”命令。
你可以通过绕开init脚本来解决这个问题。 但是以root身份运行Tomcat是坏的,所以更好的方法是将其他端口80发送到Tomcat,即使Tomcat以非root用户身份运行。 最常见的方法是在前面运行Apache httpd,另一个(如果你不想摆弄连接器)是使用iptables来映射端口80。
有关如何执行这些操作的详细信息,请参阅serverfault问题 。
这是一个已经被修复的已知的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" }}}