aai*_*rey 6 tomcat tomcat6 centos6
我在停止和启动 tomcat6(来自 repos 的包)时遇到了这个问题。我见过几个 CentOS 6 和 RHEL 6 机器。
症状是当我想重新启动或停止 tomcat6 时,它只是失败了。这似乎只有在运行一段时间后才会发生。我有一个全新的 CentOS 6 安装并且能够重新启动它,但现在不能了。
这是我看到的:
# service tomcat6 restart
Stopping tomcat6: [FAILED]
Starting tomcat6: [FAILED]
Run Code Online (Sandbox Code Playgroud)
当我尝试通过时/usr/sbin/tomcat6
:
# /usr/sbin/tomcat6 stop
/usr/sbin/tomcat6: line 60: /logs/catalina.out: No such file or directory
Run Code Online (Sandbox Code Playgroud)
和输出/var/log/tomcat6/catalina.out
:
Oct 22, 2012 4:53:31 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at java.net.Socket.<init>(Socket.java:392)
at java.net.Socket.<init>(Socket.java:206)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:424)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Run Code Online (Sandbox Code Playgroud)
我搜索了网络,我可以看到我并不孤单,但还没有找到合适的解决方案,因此我的问题。
BTW:我对tomcat 不太熟悉。哦还有:第一次发帖!所以要乖一点;)
标准 Tomcat 关闭脚本的问题在于它不够坚固。当您使用发行版的服务脚本来停止 Tomcat 时,您最终只会调用 Tomcat 自己的关闭脚本。CentOS 在这方面没有什么不同。出于这个原因,您需要熟悉 Tomcat 的关闭脚本可以为您做什么,最重要的是它不能做什么:它实际上并不能保证 Tomcat 会死掉。离得很远。
问题是Tomcat很容易陷入某种无法通过其管理端口甚至通过TERM
信号杀死它的情况。
让我们回顾一下如何按升级顺序杀死 Tomcat:
通过其管理端口杀死 Tomcat。这是默认设置,也是 Tomcat 自己的关闭脚本首先尝试的操作。如果 Java 进程因某种原因挂起,它将无法工作。您在 Internet 上看到的所有人们抱怨 Tomcat 不会停止的报告或多或少都在这条胡同里。这真的不是 Tomcat 的错。创建一个 Web 应用程序非常容易,通过这种方法可以使整个容器挂起或无法停止。
通过向 Java 进程发送TERM
信号来杀死 Tomcat 。这是一种比 (1) 中更强大的杀死 Tomcat 的方法,Tomcat 自己的关闭脚本将尝试执行此操作,但只有在您已CATALINA_PID
在 Tomcat 中设置变量时才会激活它setenv.sh
。(在任何情况下都强烈推荐)。通过向 Unix/Linux 进程发送TERM
信号来杀死它是kill
操作系统命令的默认设置。这是告诉 Unix/Linux 进程死亡的礼貌方式。不幸的是,即使这在极少数情况下也不会杀死 Tomcat 进程。
通过向 Java 进程发送KILL
信号来杀死 Tomcat 。(从操作系统命令行这将是kill -9 <pid>
)。这将始终终止进程,应该是最后的手段。这里的问题是,即使方法 (1) 和 (2) 失败,标准的 Tomcat 关闭脚本也永远不会尝试这样做。因此,如果您真的想确保 Tomcat 已被杀死,那么您别无选择,只能围绕 Tomcat 自己的关闭脚本实现自己的包装脚本。
如果在生产环境中运行 Tomcat,您真的需要考虑是否可以忍受 Tomcat 在运行时没有死(或没有重新启动)的情况,例如service tomcat restart
. 您可能通过 cron 执行此操作,在这种情况下,您肯定会期望得到确定性的结果,对吗?
始终使用setenv.sh
您定义CATALINA_PID
. 这至少会给你上面的方法#2。setenv.sh
默认情况下,Tomcat 的文件不存在,因此您必须自己创建它。
围绕 Tomcat 自己的脚本创建一个包装脚本,以确保 Tomcat 真的消亡。
在我工作的地方,我们已经在所有将 Tomcat 作为服务运行的主机上实现了这一点。对于任何 Unix/Linux 变体,它都是相同的问题/解决方案。
我在 CentOS 上运行 Tomcat7;以前我运行的是Tomcat6。
为了重新启动Tomcat,我总是进入Tomcat安装的bin目录并运行shutdown.sh,然后运行startup.sh您应该能够以这种方式作为后备方法
归档时间: |
|
查看次数: |
30905 次 |
最近记录: |