由一个自动部署脚本引发的血案。。。This is very likely to create a memory leak

前阵子,为了提高项目部署的效率,写了个shell脚本如下:

#!/bin/sh
export tomcat_name=apache-tomcat-8.5.16-front
export tomcat_home=/data/$tomcat_name
TomcatID=$(ps -ef |grep tomcat |grep -w $tomcat_name|grep -v 'grep'|awk '{print $2}')
echo "[info]进程$TomcatID将要被清理。。。"
kill -9 $TomcatID  # 杀掉原tomcat进程
sleep 3
TomcatID=$(ps -ef |grep tomcat |grep -w $tomcat_name|grep -v 'grep'|awk '{print $2}')
if [[ !$TomcatID ]];then # 这里判断TOMCAT进程是否存在  
    echo "[info]进程清理成功"
    export bak=$tomcat_home/appbak/$(date -d "today" +"%Y%m%d_%H%M%S")
    mkdir $bak
    echo "[info]开始备份应用程序至$bak。。。"
    cp -r  $tomcat_home/webapps/ROOT $bak/
    echo "[info]备份应用程序至$bak完成"
    rm -rf $tomcat_home/webapps/ROOT $tomcat_home/webapps/ROOT.war 
    echo "[info]开始部署应用程序。。。"
    cp *.war $tomcat_home/webapps/ROOT.war
    echo "[info]部署应用程序完成,开始启动。。。"
    rm -rf *.war
    $tomcat_home/bin/startup.sh && tail -f $tomcat_home/logs/catalina.out

 else  
    echo "[error]进程$TomcatID清理失败,请重试!"
fi  

脚本主要完成的工作是查看Tomcat进程号、杀掉进程、备份原应用、将当前文件夹下的war移动到tomcat下、启动Tomcat并查看启动日志。

然后接下来这几天血案频发了。。。。。

30-Aug-2017 22:59:49.991 信息 [Thread-12] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-28080"]
30-Aug-2017 22:59:49.994 信息 [Thread-12] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
30-Aug-2017 22:59:50.054 警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
30-Aug-2017 22:59:50.055 警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DubboRegistryFailedRetryTimer-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
30-Aug-2017 22:59:50.055 警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [localhost-startStop-1-SendThread(localhost:2080)] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Thread.sleep(Native Method)
 org.apache.zookeeper.ClientCnxnSocketNIO.cleanup(ClientCnxnSocketNIO.java:230)
 org.apache.zookeeper.ClientCnxn$SendThread.cleanup(ClientCnxn.java:1185)
 org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1122)
30-Aug-2017 22:59:50.056 警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DubboSaveRegistryCache-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)
30-Aug-2017 22:59:50.056 警告 [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [New I/O worker #1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
 sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
 sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
 sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
 sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
 org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:68)
 org.jboss.netty.channel.socket.nio.AbstractNioSelector.select(AbstractNioSelector.java:409)
 org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:206)
 org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
 org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
 org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
 org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 java.lang.Thread.run(Thread.java:745)

经常早上来了看到Tomcat挂掉了,和这一堆异常日志。开始的时候我怀疑是哪里创建了好多线程但都没关闭导致的,可是又没发现哪里有这样的操作。直到发现了这篇神作:http://ifeve.com/why-kill-2-cannot-stop-tomcat/
仔细拜读之后。。。。再看看日志报错时间,这不就是发生在我下班关机的时候么。。。。
原因:使用脚本部署项目之后,没有退出日志查看,直接关掉了ssh

你可能感兴趣的:(java,linux)