问题:tomcat在运行过程中会莫名挂掉,表现如被Killed -9,系统中没有任何日志(命令行无Kill指令记录、/var/log/message中无OOM Killer日志、项目本地目录无core dump日志、无java crash日志、应用中记录了eixt操作,日志中没有看到该记录)。不知道大伙儿遇到过这种情况不,有啥建议不?
下面是我排查的情况:
软件环境
$ uname -a
Linux server-224 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS release 6.3 (Final)
tomcat 7.0.39
$ java -version
java version "1.7.0_15"
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
测试流程:
crontab中设置每隔15分不断重启tomcat
启动脚本如下:
$ cat notasktest.sh
#!/bin/sh
source /etc/profile
PROJECT="notask"
COUNT=`ps aux|grep java|grep $PROJECT|awk '{print $2}'|wc -l`
if [ $COUNT -le 0 ]
then
echo process not exist
else
cd $project_dir
bin/shutdown.sh
sleep 5
ps aux|grep "java"|grep $PROJECT|awk '{print $2}'|xargs kill -9
sleep 5
bin/startup.sh
fi
启动成功后的进程信息:
/usr/bin/java -Djava.util.logging.config.file=$project_dir/gameserver.notask/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms4096M -Xmx4096M -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:HeapDumpPath=$project_dir/gameserver.notask/log/heap.hprof -Dproject=notask -Djava.rmi.server.hostname=ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1108 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:$project_dir/gameserver.notask/log/gc.log -XX:ErrorFile=$project_dir/gameserver.notask/log/java_error_%p.log -Djava.endorsed.dirs=$project_dir/gameserver.notask/endorsed -classpath $project_dir/gameserver.notask/bin/bootstrap.jar:$project_dir/gameserver.notask/bin/tomcat-juli.jar -Dcatalina.base=$project_dir/gameserver.notask -Dcatalina.home=$project_dir/gameserver.notask -Djava.io.tmpdir=$project_dir/gameserver.notask/temp org.apache.catalina.startup.Bootstrap start
现象:
tomcat进程在启动成功后,可能突然挂掉。效果类似被kill -9
难点:
1、是否挂掉不确定(所以比较难复现,导致很难用回滚法定位问题所在)
2、挂掉时间不确定,有可能刚启动就挂掉,也可能运行一阵子才挂掉。
3、挂掉后,系统中没有任何日志(tomcat自带的日志logs下什么都没有,当前项目目录也什么都没有)
分析:
被kill(系统、其他进程、人为、自身)、 异常(系统、自身)
努力:
1 捕捉未处理的异常
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
UncaughtExceptionHandler old = Thread
.getDefaultUncaughtExceptionHandler();
@Override
public void uncaughtException(Thread t, Throwable e) {
java.io.StringWriter s = new StringWriter(80);
e.printStackTrace(new PrintWriter(s));
logger.error(
"线程异常结束:" + t.getName() + "("
+ Long.toHexString(t.getId()) + ")\n"
+ s.toString(), e);
if (old != null) {
old.uncaughtException(t, e);
}
}
});
2 捕捉代码中的exit
System.setSecurityManager(new MySecurityManager());
//------------------MySecurityManager.java关键代码如下
public class MySecurityManager extends SecurityManager {
@Override
public void checkExit(int status) {
logger.error("严重bug,系统退出!"+ new Exception());
throw new SecurityException("not allow to call System.exit");
}
3 在启动指令中(详情见上)指定了XX:+HeapDumpOnOutOfMemoryError XX:HeapDumpPath=$project_dir/gameserver.notask/log/heap.hprof
Xloggc:$project_dir/gameserver.notask/log/gc.log -XX:ErrorFile=$project_dir/gameserver.notask/log/java_error_%p.log
捕捉堆栈信息、crash信息
4 开启了系统日志
service rsyslog start
5 开启coredump日志
cat /etc/security/limits.conf
* soft nofile 32768
* hard nofile 65536
* soft core unlimited
* hard core unlimited
# End of file
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62825
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
3.6 通过history查看当时没有命令行执行的指令记录,没看到kill指令
export HISTTIMEFORMAT='%F %T - ' #开启每条指令的时间/etc/profile
分享到:
相关推荐
Shell脚本定时监控tomcat,服务挂掉自动重启
### Linux下Tomcat的启动、关闭、杀死进程 在Linux环境下管理Apache Tomcat服务器是非常常见的运维操作之一。本文将详细介绍如何在Linux系统中启动、关闭以及强制终止(杀死)Tomcat进程。 #### 一、启动Tomcat ...
tomcat shutdown后,进程还存在linux系统中的解决办法
为了解决这个问题,我们需要创建一个名为 `tomcat` 的专用用户和组,以降低安全风险并限制Tomcat的权限。执行以下命令: ```bash groupadd www useradd -r -s /sbin/nologin -g www tomcat ``` 接下来,将Tomcat...
3. **重启机制**:如果发现 Tomcat 服务未响应且进程不存在,则尝试停止已有的 Tomcat 进程(如果存在),然后重新启动 Tomcat 服务。 #### 代码解析 ```java import java.net.URL; import java.net.URLConnection...
### 如何启动、重启及杀死Tomcat进程 在IT运维工作中,经常需要对服务器上的应用进行启动、重启或停止操作,以确保应用的稳定运行。本文档将详细介绍如何通过命令行来启动、重启以及杀死Tomcat进程的方法。这对于...
此小程序专门用来守护Tomcat进程 【运行方法】 直接双击TomcatWatcher.jar 程序通过访问http://localhost和输入的Tomcat端口来访问Tomcat主页,如果获取到返回串证明Tomcat运行中,否则检测JAVA.EXE进程是否存在。...
描述中提到的“自动重启已挂掉的tomcat服务器,省去人工人力,保证服务器的正常运行”,意味着通过自动化机制,可以避免因为Tomcat崩溃导致的服务中断,同时减少管理员的维护工作量。这不仅提高了服务的可用性,也...
### Window与Tomcat部署程序后的进程管理 #### 一、部署环境配置 部署的位置为IP地址10.172.29.39,端口号8086,具体的目录为`D:\vas\BSIFMS\tomcat6`。在这里部署的应用程序的进程名称为`ifms.exe`。 #### 二、...
2. **自动重启机制**:如果检测到Tomcat服务器异常或未响应,则触发自动重启逻辑。 3. **Java编程实现**:使用Java语言编写程序来实现状态检测与自动重启功能。 ### 二、详细知识点解析 #### 1. Tomcat运行状态...
标题中的“tomcat守护进程.rar”指的是一个关于如何在Windows操作系统下配置Tomcat服务器作为守护进程的教程或代码集合。守护进程(Daemon)通常是指在后台运行而不与用户交互的进程,这种设置允许Tomcat在没有图形...
因此,更改Tomcat进程名称可以有效解决这一问题,使运维人员能够快速定位和管理各个服务器实例。 ### 二、修改步骤详解 #### 步骤1:编辑`setclasspath.bat`文件 首先,需要定位到`tomcat_home\bin`目录下的`set...
为了解决这个问题,我们可以通过为Tomcat进程设置别名来区分各个实例,便于故障排查和管理。 首先,我们来看如何修改窗口显示名称,也就是启动Tomcat时DOS窗口的标题。在Windows中,Tomcat的启动脚本startup.bat...
【标题】:“Tomcat配置解决跨域问题” 在Web开发中,跨域(Cross-Origin)是一种常见的安全限制,它阻止浏览器从一个源加载资源到另一个不同的源。这主要是为了防止恶意脚本通过注入来窃取数据。然而,在进行前后...
在本文中,我们将深入探讨Tomcat进程意外退出的问题,这对于任何使用Apache Tomcat作为Web服务器的开发者或系统管理员来说都是一个常见的挑战。Tomcat进程的非预期终止可能会导致服务中断,影响应用程序的可用性和...
Tomcat无法正常启动的解决办法 教你如何解决Tomcat无法正常启动 欢迎下载
此小程序专门用来守护Tomcat进程 【运行方法】 直接双击TomcatWatcher.jar 程序通过访问http://localhost和输入的Tomcat端口来访问Tomcat主页,如果获取到返回串证明Tomcat运行中,否则检测JAVA.EXE进程是否存在。...
为了解决Tomcat在IP和端口不同时引发的跨域问题,可以通过编写并配置`crossDomain.xml`文件来实现跨域支持。下面将详细介绍几种常见的配置方式: ##### 1. 允许特定域名访问 在某些情况下,可能只需要允许来自特定...
本文将深入探讨如何将Tomcat设置为守护程序,以便在系统启动时自动运行,并且在意外关闭后能自动重启,确保服务的连续性。 首先,我们需要理解"守护进程"的概念。在操作系统中,守护进程(Daemon)是一种在后台运行...