精华内容
下载资源
问答
  • 最近公司项目的Dev环境要自己维护,为了避免麻烦,写了一个发布脚本,但是发现每次关闭和服务器的SSH连接后,Tomcat就意外退出,查看日志发现最后退出有如下几行日志:Nov 10, 2017 2:38:35 PM org.apache.coyote....

    最近公司项目的Dev环境要自己维护,为了避免麻烦,写了一个发布脚本,但是发现每次关闭和服务器的SSH连接后,Tomcat就意外退出,查看日志发现最后退出有如下几行日志:

    Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol pause
    INFO: Pausing ProtocolHandler ["http-nio-8080"]
    
    Nov 10, 2017 2:38:35 PM org.apache.catalina.core.StandardService stopInternal
    INFO: Stopping service Catalina
    
    [INFO][2017-11-10 14:38:35] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:960) Closing WebApplicationContext for namespace 'Dispatcher-servlet': startup date [Fri Nov 10 14:37:53 CST 2017]; parent: Root WebApplicationContext
        [INFO][2017-11-10 14:38:35] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:960) Closing Root WebApplicationContext: startup date [Fri Nov 10 14:37:52 CST 2017]; root of context hierarchy
        Nov 10, 2017 2:38:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
    SEVERE: The web application [/] appears to have started a thread named [FileWatchdog] but has failed to stop it. This is very likely to create a memory leak.
    Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol stop
    INFO: Stopping ProtocolHandler ["http-nio-8080"]
    Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol destroy
    INFO: Destroying ProtocolHandler ["http-nio-8080"]

    最开始怀疑是 OOM 问题,排查代码没有发现相关问题,JVM配置OOM后转存堆内存快照,也没有发现问题,后来发现规律是每次关闭SSH连接一会儿后Tomcat即关闭,度娘后发现如下文章:

    tomcat进程意外退出的问题分析

    -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=\data\heap\

    解决方案

    在脚本开始添加 set -m,使用监视模式。

    问题原因

    • SSH关闭后,操作系统kill掉脚本;
    • Java进程挂在了脚本进程下面;

    修改后的脚本

    修改后的发布脚本:

    #!/bin/sh
    # author qiesai
    
    ##调用格式:base-war-deploy-tools.sh proName branchName profile 
    ##命名规则:proName作为back、release、war的名称存在,要保持一致
    PRO_NAME=$1
    BRANCH_NAME=$2
    PROFILE=$3
    
    BASE_DIR=`pwd`
    CODE_DIR="/data/code/${PRO_NAME}/"
    RELEASE_DIR="/data/release/"
    BACKUP_DIR="/data/backup/"
    WAR_NAME="${PRO_NAME}.war";
    
    
    function stopTomcat(){
        echo "_______________________________"
        echo "stop tomcat"
    
        TOMCAT_PID=`ps -ef|grep tomcat | grep -v 'grep\|tail' | awk '{print $2}'`
        if [ -n "$TOMCAT_PID" ]; then
            echo "tomcat is running : ${TOMCAT_PID} , will stop it"
            kill -9 $TOMCAT_PID
        fi
    
        COUNT=0  
        while [ $COUNT -lt 1 ]; do      
            echo -e ".\c"  
            sleep 1
            COUNT=1
    
            PID_EXIST=`ps --no-heading -p $TOMCAT_PID`  
            if [ -n "$PID_EXIST" ]; then  
                COUNT=0
                break
            fi 
        done
        echo ""
        echo "stop tomcat succes"
    }
    
    function buildProject(){
        source /etc/profile
        echo "_______________________________"
        echo "pull git code"
        cd $CODE_DIR
        git branch -q $BRANCH_NAME
        git checkout $BRANCH_NAME
        git pull origin $BRANCH_NAME
        echo "_______________________________"
        echo "buil project"
        echo `/data/maven/maven/bin/mvn clean package -P${PROFILE}`
        echo "buil finish"
    }
    
    function releaseWar(){
        echo "_______________________________"
        echo "deploy war"
        cd $RELEASE_DIR
        mv -f ./$WAR_NAME $BACKUP_DIR$WAR_NAME
        #注意不要 rm -rf /*也不要 cd到/下
        rm -rf *
        mv -f $CODE_DIR/target/$WAR_NAME ./$WAR_NAME 
        #set -m是解决Tomcat关闭的关键点。
        set -m
        nohup /data/tomcat/bin/startup.sh &
        echo "deploy success"
    }
    
    function main(){
        if [ -z "$PRO_NAME" ]; then
            echo "please input project name"
            exit;
        fi
    
        if [ -z "$BRANCH_NAME" ]; then
            echo "please input a git branch name"
            exit;
        fi
    
        if [ -z "$PROFILE" ]; then
            echo "please choose a profile"
            exit;
        fi
    
        echo "=====================begin deploy====================="
        buildProject;
        stopTomcat;
        releaseWar;
        echo "=====================deploy succ====================="
        tail -f /data/tomcat/logs/catalina.out
    }
    
    main;
    展开全文
  • 最近遇到一个很诡异的问题,远程登录服务器,本来是想查看一下Tomcat的运行情况,结果用鼠标把窗体一拖,Tomcat居然自己关上了!就好像是自己按下了Ctrl+C一样!同事的电脑都没有出现这种情况,后来换了鼠标也不行...
    转载自:http://blog.csdn.net/lfsf802/article/details/48810313
    最近遇到一个很诡异的问题,远程登录服务器,本来是想查看一下Tomcat的运行情况,结果用鼠标把窗体一拖,Tomcat居然自己关上了!就好像是自己按下了Ctrl+C一样!同事的电脑都没有出现这种情况,后来换了鼠标也不行(第一个反应就是鼠标的问题)。最后关了几个正在运行的软件,居然又好了。
    经过排查,确定是“有道词典”的问题,这个软件有个“划词”的功能,就是它搞的鬼,把“划词”功能一关就好了。
    
    借着个机会整理一几种tomcat异常退出的情况和解决办法。
    
    一般情况引起tomcat异常退出的情况出现在下面几种情况:
        1.并发用户数目过大,也会导致tomcat自动停止服务。 
        2.系统本身的网络负载平衡没有做好,导致tomcat自动停止服务; 
        3.程序迭代不合理也是一个原因; 
        4.数据库连接未关闭,导致资源损耗过重,会引起服务停止; 
        5.程序严重错误,也会引起tomcat停止服务!
    
    
    通常情况下,如果冰法用户数目过大的话,可能会出现内存溢出现象,这时候需要针对tomcat的jvm内存配置进行修改,通常修改就是在catalina.bat中添加:
    set CATALINA_OPTS=-Xms128M -Xmx256M
    set JAVA_OPTS=-Xms128M -Xmx256M
    或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M -Xmx256M 
    具体数字需要根据具体情况而定。
    
    还有一种情况就是通过优化程序代码完成内存的合理使用,这块内容需要找到程序中消耗内存的地方,减少循环之类的问题。
    
    另外一种情况就是连接未关闭的问题,这个问题也是经常出现的,这块内容需要特别注意,或者引入连接池来做此事情,但是连接池设置的大小也需要特殊情况特殊处理,如果处理不好也会出现连接数过小访问出错的问题。
    
    还有一种情况tomcat会异常退出,可以参见此博客http://ifeve.com/why-kill-2-cannot-stop-tomcat/,这里面提到的问题也是挺有意思,注意sshd关闭引起tomcat关闭问题。
    
    还有一种情况是tomcat配置负载问题导致,这里可以参照http://www.cnblogs.com/shiyangxt/archive/2009/02/26/1398902.html 博客进行配置。
    
    当然,经常使用tomcat的可能会遇到tomcat启动一闪而停的现象,这里可能是因为jdk环境变量配置问题,出现此问题可以先检查jdk环境是否配置好。
    
    tomcat异常退出问题有很多种,需要进行严格的分析,如果后面再有遇到其他种类的异常退出,在及时更新。
    

     

    展开全文
  • 中提到Tomcat会无缘无故退出,而且在日志中找不到原因.后来终于知道为什么了: 由于内存不足,被OOM Killer杀死的!由于是直接被系统进程杀死,所以它自己没有机会留下任何日志. 这是我偶然跟一个技术牛人提起这个事情的...

    我在这篇文章<写一个脚本,自动启动Tomcat>中提到Tomcat会无缘无故退出,而且在日志中找不到原因.后来终于知道为什么了: 由于内存不足,被OOM Killer杀死的!由于是直接被系统进程杀死,所以它自己没有机会留下任何日志.

    这是我偶然跟一个技术牛人提起这个事情的时候得到的提示,他说会不会是内存不足?我一想我们的服务器只有512M内存,确实有这个可能性,但服务器又没有图形界面,其运行环境应该还是挺纯粹的,不会消耗太多内存吧?不管怎么说,得找证据,证明这是由于内存不足引起的.功夫不负有心人,证据就在这里:

    egrep -i 'killed process' /var/log/messages

    自己看看吧.

    怎么办?除了加内存,基本上没什么办法.我们使用的是阿里云服务器,加内存还是蛮简单的,垫点钱就行了,我把内存从512M加到了1G,对服务器来说,仍然是很寒酸的,想想10年前我买的个人电脑就已经有1G的内存了,不过对我们这种创业公司来说,钱是能省一点就省一点了,等需要的时候再给服务器扩容吧.

    后来我再查看了下内存利用率,发觉Java真是不折不扣的内存杀手.反正用到现在给我感觉就是启动慢,消耗内存大.当然了,一旦真正跑了起来,速度还是可以的.

    转载于:https://www.cnblogs.com/guogangj/p/4201738.html

    展开全文
  • 前奏: 最近在Linux部署tomcat应用的时候发现停止tomcat后,自己的进程还在,必须要用kill命令强行杀掉进程,每次这样做感觉很不妥,所以现在我来找一下出现这个问题的根本原因并给出解决方案。背景:有一天我发现公司...

    前奏: 最近在Linux部署tomcat应用的时候发现停止tomcat后,自己的进程还在,必须要用kill命令强行杀掉进程,每次这样做感觉很不妥,所以现在我来找一下出现这个问题的根本原因并给出解决方案。


    背景:有一天我发现公司的Ubantu服务器内存不够用了……,32G内存!而且这台服务器只部署了我一个服务。what?神马情况,一脸萌币。让我静静…………。

    好了,安静了,现在开始分析原因。

    首先我执行了 ps|aux grep tomat(意思就是查找所有带有tomcat相关的进程),发现有N个tomcat进程在运行(截图省略),每个进程占用1个G内存左右。关键还调用不到它……,很忧桑。仔细想了想难道是以前的tomcat都没关闭成功? ./shutdown这个方法失灵了?

    是的,的确失灵了,现在我们来分析一下它失灵的原因。

    第一步.首先打开tomcat的logs里面catalina.out查看日志,发现出现如下日志

    这里写图片描述
    针对图中的两处红圈做以下分析:
    a.从1处可以看出大致意思是说tomcat尝试关闭一个名为pool-1-thread-4的线程但是失败了,这样很有可能会导致内存泄漏。一听到内存泄露,大家可能会担心受怕,不过没关系,我慢慢来找出原因并解决它。
    b.从2处可以看到这里我用了一个第三方分词服务的工具:word分词1.3版。很有可能导致进程无法停止的罪魁祸首是它导致的。

    第二步.于是我根据它给的代码提示,找到了分词工具中的源码代码块。
    这里写图片描述
    从这里我们能看到它的服务里面有一个资源监控的方法,这方法运行在ExceutorService线程池里面,它的作用是为了监听目录下资源的变化,如果有变动,则重新加载资源,和web.xml配置log4j的配置文件变化监听很像。而且它使用的是while(true)死循环并且没有任何判断break操作的地方,同时根据WatchService.take我们发现它在这里进行了线程等待,每当资源变化的时候,WatchService就能take到值并返回,从而进行下一次等待。如果它运行在一个守护线程里面,当主线程关闭的时候,它会进行自动销毁。但是它是线程池开辟出来的,为非守护线程。所以如果要结束这个线程必须调用ExceutorService的shutdown方法,但是这个方法执行的前提是等待线程池里面所有的线程都完成自己的任务才会调用,很明显在我们这个死循环的代码块里面它的任务永远都不会完成。所以我们需要强制结束,调用它的shotdownNow方法。可能在它的第三方工具里面它的线程池对象是私有的,并且没有给出强制结束的方法,所以只好另辟蹊径了。

    第三步.我们利用jstack堆栈跟踪工具追踪验证一下我刚刚的分析。
    在linux服务器中查看我的web服务的java进程的pid,比如是123,然后输入 jstack 123。

    这里写图片描述
    在这里我们找了到我们刚刚的日志里面的pool-1-thread-4线程,从命名上带有pool我们就能看出它是从线程池里面开辟出来的,而且它并没有daemon标志,说明它是一个非守护线程,从waiting on condition可以看出它处于一个线程等待的状态,从之前的watchService.take来看,它是在等待资源的变化。经过以上分析,已经很明确进程没能成功关闭是由于它一直处于线程等待导致的,jvm会认为你这个线程里面的任务并没有执行完,从而关闭失败。

    到这里,我们已经找到了关闭失败的原因了,现在我们来看一下如何解决这个问题。

    刚刚提到分词工具里面的线程池对象已经被设为私有,并且并没有提供较好的关闭方法。所以我这里找了两个方案来结束这个进程。

    方案一
    在程序shutdown前,设置监听,停止之前我们需要做一些事情,就是关闭这些进程。我们可以获取到所有的jvm进程并执行中断操作。
    a.a.获取jvm的所有进程。

    public static Thread[] findAllThreads() {  
            ThreadGroup group =   
                Thread.currentThread().getThreadGroup();  
            ThreadGroup topGroup = group;  
            // traverse the ThreadGroup tree to the top  
            while ( group != null ) {  
                topGroup = group;  
                group = group.getParent();  
            }  
            // Create a destination array that is about  
            // twice as big as needed to be very confident  
            // that none are clipped.  
            int estimatedSize = topGroup.activeCount() * 2;  
            Thread[] slackList = new Thread[estimatedSize];  
            // Load the thread references into the oversized  
            // array. The actual number of threads loaded   
            // is returned.  
            int actualSize = topGroup.enumerate(slackList);  
            // copy into a list that is the exact size  
            Thread[] list = new Thread[actualSize];  
            System.arraycopy(slackList, 0, list, 0, actualSize);  
            return list;  
        }

    a.b对每个线程进行中断操作。

            Thread[] threads = findAllThreads();
            for(Thread thread : threads){
                thread.interrupt();
            }

    至此,在执行tomcat ./shutdown后就可以顺利地关闭进程。

    方案二
    还有个更暴力的方法结束进程,就是在结束的时候执行

    System.exit(0);

    可以直接将进程结束,这里你可能会担心,这个方法是结束jvm虚拟机,调用这个方法会不会把我linux里面其它的java进程全部结束,这里你的担心是多余的,如果你对jvm的运行机制有一定的了解,就可以大不必担心这个了。

    展开全文
  • 之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下。先简单说下测试过程,先创建一个web服务启动 test.sh,内容如下:#!/bin/bashcd/...
  • linux tomcat 快捷操作

    2019-09-28 19:05:08
    linux快捷方式启动tomcat 1.脚本路径 /etc/init.d/... 按 a 编辑,将下面内容根据你自己的情况(主要是修改 /usr/local/tomcat6/bin/ ) 修改后copy到编辑框中, esc 退出编辑,:wq 保存退出 Java代码 ...
  • 从文件夹中运行tomcat9w.exes时报错 ...(注意,这个是我的路径,你们按照自己的安装路径自己进去) 随后bin目录下输入 service.bat install service.bat install 然后安装完就可以正常打开了。 ...
  • Tomcat无法startup踩坑

    2020-04-27 18:38:06
    如图中问题,显示了几个Using后就退出了 原因是Tomcat版本高于JDK版本,理论上重新安装最新版本的JDK即可 但是,我又发现JDK安装时环境变量怎么设置都没用,经过检查发现Win10居然自带了一个Java!而且这个Java在...
  • Tomcat意外宕机分析

    2018-05-13 16:13:00
    之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下。  先简单说下测试过程,先创建一个web服务启动 test.sh,内容如下: #!/bin/...
  • liunx下配置tomcat端口

    2018-05-30 15:12:24
    1、打开tomcat配置文件#vi /usr/local/apache-tomcat/conf/server.xml2、打开Tomcat配置文件之后按 /8080 快速检索3、修改端口,按 i 进行,将8080 修改为 80** ---这个看自己想定义什么端口4、按:wq 保存并退出5...
  • 脚本路径 /etc/init.d/tomcat首先执行: vi /etc/init.d/tomcat按 a 编辑,将下面内容根据你自己的情况(主要是修改 /usr/local/tomcat6/bin/ )修改后copy到编辑框中, esc 退出编辑,:wq 保存退出Java代码 # !...
  • 问题描述:(补充:闪退可以用记事本打开startup.bat,添加 pause 这个单词 在... 后来发现自己是使用的是源码包的tomcat!!!!  正确的应该是使用这个压缩包的tomcat  当然它俩解压缩后都是如下的样子 ...
  • idea编译器没有tomcat的选项解决方案

    万次阅读 2017-12-18 17:57:23
    对于IDEA找不到tomcat的选项解决方案 ...然后需要自己退出编译器,然后再找到Plugins 在搜索框中输入tomcat直接搜索 点击OK确定,Restart编译器,再进去后就会有tomcat选项了 点击+号就会有tomcat选项
  • TOMCAT之终极优化

    2014-06-11 12:35:11
     最近因为负责这一块的哥们退出了团队,很多工作自己都要接手,包括实施,开发,架构甚至美工,由于创业的资金有限,让服务器发挥最大性能是很必要的,后来就自己研究了一下TOMCAT的优化并优化了所有优科的服务器,...
  • 按 a 编辑,将下面内容根据你自己的情况(主要是修改 /usr/local/tomcat6/bin/ ) 修改后copy到编辑框中, esc 退出编辑,:wq 保存退出 [code="java"]# !/bin/bash # Description: sta...
  •  (1)应用程序调用System.exit方法或最后一个非守护进程non-daemon退出  (2)用户在关java程序之前,突然强制关机,比如CTRL+C或者注销系统  2. JVM为shuttingdown提供了两段式处理流程  (1)JVM会和所有注册...
  • 在Linux中重启Tomcat服务器

    万次阅读 2017-02-27 17:11:24
    可以看到我现在所在的目录是/root目录下,据我所知我的tomcat安装在home目录下的某个字文件夹下面,所以我要退出/root目录进入/home目录;输入 cd ../(回退到根目录),用ls命令看一下 看到了home,cd进去,在ls...
  • 1.使用startup.bat启动tomcat,一直报错端口号被占用,并且被退出,启动不起来。 2.找到了原因,电脑原来安装了一个tomcat,并且环境变量中有CATALINA_HOME,原因是启动tomcat总会通过环境变量查找。 解决方法: ...
  • tomcat的默认端口是8080,但该端口不是tomcat的唯一端口,可以通过修改tomat的配置文件进行修改,打开tomcat所在的conf文件夹的...找到等代码,将8080改为自己想改的端口,这里我改为8088保存退出; 之后重启就ok了
  • 1、进入Linux的logs目录 cd /usr/tomcat/tomcat7/logs (根据自己的路径去写) 2、执行 tail -f catalina.out 命令 这样就可以查看tomcat的日志了。 3、ctrl+C 退出
  • 2.打开tomcat文件中的bin文件夹,找到service.bat双击,会显示一个命令窗口,等它自己执行完毕并退出。 3.单击eclipse菜单栏中的Run,单击Run Configurations出现如下图的窗口 左侧找到Tomcat单击下面的new_...
  • Tomcat部署后无法登陆

    2018-07-03 18:51:27
    最近因为做项目,在阿里云上申请了一个学生服务器,打算研究一下,顺带做一个专属自己的网页。然而在配置服务器上出现了一些问题。首先,附上一个链接:https://www.jianshu.com/p/2604e53a7f6a?from=singlemessage...
  • 脚本路径 /etc/init.d/tomcat首先执行: vi /etc/init.d/tomcat按 a 编辑,将下面内容根据你自己的情况(主要是修改 /usr/local/tomcat6/bin/ )修改后copy到编辑框中, esc 退出编辑,:wq 保存退出Java代码# !...
  • 1.脚本路径 /etc/init.d/...将下面内容根据你自己的情况(主要是修改 /usr/local/tomcat7 ) 修改后copy到编辑框中, esc 退出编辑,:wq 保存退出 # !/bin/bash # Description: start or stop the tomcat # Usage:

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

tomcat自己退出