说实话,我不确定到底发生了什么。我安装了 tomcat 8.0.9 包 (tomcat8),一旦启动服务,它就可以正常工作。但是,在某个时候,它会关闭,我不知道为什么。catalina.out 也没有说明原因。有人知道我该如何找出导致关闭的原因吗?
下面是 catalina.out 的片段,显示我最后一次启动服务器是在 1 月 13 日。它没有关机消息,并显示我今天早上重新启动了它(sudo service tomcat8 start):
INFO: Starting ProtocolHandler ["http-nio-8080"]
Jan 13, 2015 11:44:37 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Jan 13, 2015 11:44:37 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 7942 ms
Tue Jan 13 23:45:58 EST 2015-25 java.lang.instrument.Instrumentation is used to reload class files
Jan 15, 2015 9:53:52 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Jan 15, 2015 9:53:52 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Jan 15, 2015 9:53:52 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Jan 15, 2015 9:53:52 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Jan 15, 2015 9:53:52 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2925 ms
Jan 15, 2015 9:53:52 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jan 15, 2015 9:53:52 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.9 (Ubuntu)
Jan 15, 2015 9:53:52 AM org.apache.catalina.startup.HostConfig deployDescriptor
除非这一行“java.lang.instrument.Instrumentation 用于重新加载类文件”告诉我有关关机的信息,否则我看不到有关关机原因的任何信息。
我以为可能有人盲目地通过 telnet 进入它并通过发出 SHUTDOWN 来关闭它,但我的 iptables 设置为现在允许除我的家用电脑之外的任何连接。
iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http
5 ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
6 ACCEPT tcp -- removed.my.ip.here anywhere tcp
7 DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
有没有办法在 tomcat8 中启用额外的日志记录,以便我可以看到导致关机的原因?
编辑:2015 年 1 月 23 日 - 我已经升级到 Tomcat 8.0.17(最新版本),但问题仍然存在,而且日志文件中仍然没有任何线索...
要求提供更多信息:
- Ubuntu 14.10
- 由 Luna Node Dynamic 主办
- Linux dev 3.16.0-29-generic #39-Ubuntu SMP 星期一 十二月 15 22:27:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
- 512MB 内存
- 256MB 交换空间
- 1 个 CPU
- Tomcat 8.0.9
- 通过 apt-get 安装
- 通过下载二进制文件升级到 8.0.17
- 通过“service tomcat8 start”启动
- Tomcat 自行停止(这是问题所在)我从来没有停止过它,但如果我想停止它,我会使用“service tomcat8 stop”
- Java 版本信息:
- openjdk 版本“1.8.0_40-internal”
- OpenJDK 运行时环境(版本 1.8.0_40-internal-b09)
- OpenJDK 64 位服务器 VM(版本 25.40-b13,混合模式)
- 通过 apt-get 安装
在 /etc/default/tomcat8 中:
TOMCAT8_USER=tomcat8
TOMCAT8_GROUP=tomcat8
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx256m -XX:+UseConcMarkSweepGC -javaagent:/usr/share/tomcat8/railo/railo-inst.jar"
/etc/tomcat8/logging.properties:
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler
org.apache.catalina.session.level=ALL
答案1
KVM 虚拟化内核正在终止该进程,因为虚拟机内存不足。这可以通过检查 /var/log/kern.log 来验证:
Jan 28 11:30:07 dfrewind-dev kernel: [970762.688259] Out of memory: Kill process 11884 (java) score 536 or sacrifice child
Jan 28 11:30:07 dfrewind-dev kernel: [970762.690756] Killed process 11884 (java) total-vm:2317312kB, anon-rss:257188kB, file-rss:0kB
根据问题这里关于 Tomcat 重启,我决定给我的托管服务提供商发邮件,询问他们是否在我的 CPU 利用率很低的情况下终止了我的进程。他们表示,由于他们使用的虚拟化技术 (KVM) 及其隐私政策,他们不可能在不远程访问的情况下终止我服务器上的进程。
他们详细说明,每当虚拟机内存不足时,KVM 虚拟化内核就会终止使用最多内存的进程,我可以通过查看 /var/log/kern.log 来验证是否发生了这种情况。