热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TOMCAT关闭报错:Tomcatdidnotstopintime.PIDfilewasnotremoved

背景:执行shutdown.sh偶尔会报错如下,但是大部分时间还是比较正常的,希望能解决掉它1,报错信息如下:[root@ptbin]#.shutdown.shUsingCATAL



背景:执行/shutdown.sh偶尔会报错如下,但是大部分时间还是比较正常的,希望能解决掉它



1,报错信息如下:

[root@ptbin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
Using JRE_HOME: /usr/lib/jvm/java
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
Using CATALINA_PID: /var/tomcat/9300.pid
Jun 12, 2015 4:55:30 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:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:422)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:338)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:416)
Tomcat did not stop in time. PID file was not removed.
[root@ptbin]#


<版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!>

原博客地址: http://blog.csdn.net/mchdba/article/details/46482499

原作者:黄杉 (mchdba)








2,去看下pid是否存在:

[root@pt~]# ll /var/tomcat/

total 12

-rw-r–r--. 1 root root 5 Jun 12 15:41 9300.pid

[root@pt~]#

tomcat的pid确实存在,与这个pid无关




3,解决办法:

解决办法有多种


3.1 解决办法1:修改java项目的实现方式

可能项目中用到了ScheduledThreadPoolExecutor(可能是未接受stop消息导致的),导致了shutdown命令未能成功。将ScheduledThreadPoolExecutor改成spring的quartz调度就ok了。


3.2 解决办法2,加上-force强行stop掉

在catalina.sh里面

exec “PRGDIR"/"PRGDIR"/"PRGDIR"/"EXECUTABLE” stop -force “$@”

大家查看shutdown.sh的代码:

[root@ptbin]# vim shutdown.sh
PRG="$0"
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
EXECUTABLE=catalina.sh
# Check that target executable exists
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"

发现并没有echo "Tomcat did not stop in time. PID file was not removed.“的提示信息,那么报错信息肯定不是在shutdown.sh脚本里面,大家看到shutdown.sh最后有引用其它脚本exec "$PRGDIR"/"$EXECUTABLE" stop "$@"来关闭tomcat,再看到”$EXECUTABLE变量所指向的是catalina.sh,所以问题核心是在catalina.sh里面。

打开catalina.sh发现只有第453行里面有这样提示信息,如下:

433 if [ ! -z "$CATALINA_PID" ]; then
434 if [ -f "$CATALINA_PID" ]; then
435 while [ $SLEEP -ge 0 ]; do
436 kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
437 if [ $? -gt 0 ]; then
438 rm -f "$CATALINA_PID" >/dev/null 2>&1
439 if [ $? != 0 ]; then
440 if [ -w "$CATALINA_PID" ]; then
441 cat /dev/null > "$CATALINA_PID"
442 else
443 echo "Tomcat stopped but the PID file could not be removed or cleared."
444 fi
445 fi
446 break
447 fi
448 if [ $SLEEP -gt 0 ]; then
449 sleep 1
450 fi
451 if [ $SLEEP -eq 0 ]; then
452 if [ $FORCE -eq 0 ]; then
453 echo "Tomcat did not stop in time. PID file was not removed."
454 fi
455 fi
456 SLEEP=`expr $SLEEP - 1 `
457 done
458 fi

看到关键代码判断 if [ $FORCE -eq 0 ]; 那么这里就是表明前面执行异常,但是不是force强行停止掉,所以要抛一个exception出来,告诉你没有stop成功。

那么,我们可以在这里设置一个force命令来让tomcat强行stop掉。

[root@ptbin]# vim shutdown.sh
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
#改成如下
exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"
#然后再执行shutdown.sh操作,ok,就不会报错,正常执行完毕了。

查看执行结果如下:

[root@ptbin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
Using JRE_HOME: /usr/lib/jvm/java
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
Using CATALINA_PID: /var/tomcat/9300.pid
[root@ptbin]#

3.3 通过bash -x分析真正的原因


3.3.1 先查看执行报错的时候的bash过程

[root@ptbin]# bash -x catalina.sh stop
+ JAVA_OPTS='-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -Xloggc:/logs/gc/9300.gc'
+ CATALINA_PID=/var/tomcat/9300.pid
+ cygwin=false
+ os400=false
+ darwin=false
+ case "`uname`" in
++ uname
+ PRG=catalina.sh
+ '[' -h catalina.sh ']'
++ dirname catalina.sh
+ PRGDIR=.
+ '[' -z '' ']'
++ cd ./..
++ pwd
+ CATALINA_HOME=/usr/local/app/apache-tomcat-6.0.37_9300
+ '[' -z '' ']'
+ CATALINA_BASE=/usr/local/app/apache-tomcat-6.0.37_9300
+ CLASSPATH=
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setenv.sh ']'
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setenv.sh ']'
+ false
+ false
+ false
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh ']'
+ BASEDIR=/usr/local/app/apache-tomcat-6.0.37_9300
+ . /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh
++ '[' -z /usr/lib/jvm/java -a -z '' ']'
++ '[' -z /usr/lib/jvm/java -a stop = debug ']'
++ '[' -z '' ']'
++ JRE_HOME=/usr/lib/jvm/java
++ '[' stop = debug ']'
++ '[' -z /usr/local/app/apache-tomcat-6.0.37_9300 ']'
++ '[' '!' -x /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh ']'
++ '[' -z '' ']'
++ JAVA_ENDORSED_DIRS=/usr/local/app/apache-tomcat-6.0.37_9300/endorsed
++ JIKESPATH=
+++ uname -s
++ '[' Linux = Darwin ']'
++ _RUNJAVA=/usr/lib/jvm/java/bin/java
++ '[' false '!=' true ']'
++ _RUNJDB=/usr/lib/jvm/java/bin/jdb
+ '[' -z /usr/local/app/apache-tomcat-6.0.37_9300 ']'
+ '[' '!' -z '' ']'
+ '[' /usr/local/app/apache-tomcat-6.0.37_9300 '!=' /usr/local/app/apache-tomcat-6.0.37_9300 ']'
+ CLASSPATH=/usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
+ '[' -z '' ']'
+ CATALINA_OUT=/usr/local/app/apache-tomcat-6.0.37_9300/logs/catalina.out
+ '[' -z '' ']'
+ CATALINA_TMPDIR=/usr/local/app/apache-tomcat-6.0.37_9300/temp
+ have_tty=0
++ tty
+ '[' /dev/pts/1 '!=' 'not a tty' ']'
+ have_tty=1
+ false
+ '[' -z '' ']'
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/conf/logging.properties ']'
+ LOGGING_COnFIG=-Djava.util.logging.config.file=/usr/local/app/apache-tomcat-6.0.37_9300/conf/logging.properties
+ '[' -z '' ']'
+ LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+ '[' 1 -eq 1 ']'
+ echo 'Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300'
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
+ echo 'Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300'
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
+ echo 'Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp'
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
+ '[' stop = debug ']'
+ echo 'Using JRE_HOME: /usr/lib/jvm/java'
Using JRE_HOME: /usr/lib/jvm/java
+ echo 'Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar'
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ echo 'Using CATALINA_PID: /var/tomcat/9300.pid'
Using CATALINA_PID: /var/tomcat/9300.pid
+ '[' stop = jpda ']'
+ '[' stop = debug ']'
+ '[' stop = run ']'
+ '[' stop = start ']'
+ '[' stop = stop ']'
+ shift
+ SLEEP=5
+ '[' '!' -z '' ']'
+ FORCE=0
+ '[' '' = -force ']'
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ '[' -f /var/tomcat/9300.pid ']'
+ '[' -s /var/tomcat/9300.pid ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ echo 0000002
0000002
+ /usr/lib/jvm/java/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -Xloggc:/logs/gc/9300.gc -Djava.endorsed.dirs=/usr/local/app/apache-tomcat-6.0.37_9300/endorsed -classpath /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar -Dcatalina.base=/usr/local/app/apache-tomcat-6.0.37_9300 -Dcatalina.home=/usr/local/app/apache-tomcat-6.0.37_9300 -Djava.io.tmpdir=/usr/local/app/apache-tomcat-6.0.37_9300/temp org.apache.catalina.startup.Bootstrap stop
Jun 13, 2015 9:27:51 AM 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:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:422)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:338)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:416)
+ echo 0000003
0000003
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ echo CATALINA_PID:/var/tomcat/9300.pid
CATALINA_PID:/var/tomcat/9300.pid
+ '[' -f /var/tomcat/9300.pid ']'
+ '[' 5 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 5 -gt 0 ']'
+ sleep 1
+ '[' 5 -eq 0 ']'
++ expr 5 - 1
+ SLEEP=4
+ '[' 4 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 4 -gt 0 ']'
+ sleep 1
+ '[' 4 -eq 0 ']'
++ expr 4 - 1
+ SLEEP=3
+ '[' 3 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 3 -gt 0 ']'
+ sleep 1
+ '[' 3 -eq 0 ']'
++ expr 3 - 1
+ SLEEP=2
+ '[' 2 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 2 -gt 0 ']'
+ sleep 1
+ '[' 2 -eq 0 ']'
++ expr 2 - 1
+ SLEEP=1
+ '[' 1 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 1 -gt 0 ']'
+ sleep 1
+ '[' 1 -eq 0 ']'
++ expr 1 - 1
+ SLEEP=0
+ '[' 0 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23430
+ '[' 0 -gt 0 ']'
+ '[' 0 -gt 0 ']'
+ '[' 0 -eq 0 ']'
+ '[' 0 -eq 0 ']'
+ echo 'Tomcat did not stop in time. PID file was not removed.'
Tomcat did not stop in time. PID file was not removed.
++ expr 0 - 1
+ SLEEP=-1
+ '[' -1 -ge 0 ']'
+ '[' 0 -eq 1 ']'
[root@ptbin]#

通过设置echo提示信息,找到报错执行语句,大家看到报错的真正原因是在于执行这一句:

/usr/lib/jvm/java/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -Xloggc:/logs/gc/9300.gc -Djava.endorsed.dirs=/usr/local/app/apache-tomcat-6.0.37_9300/endorsed -classpath /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar -Dcatalina.base=/usr/local/app/apache-tomcat-6.0.37_9300 -Dcatalina.home=/usr/local/app/apache-tomcat-6.0.37_9300 -Djava.io.tmpdir=/usr/local/app/apache-tomcat-6.0.37_9300/temp org.apache.catalina.startup.Bootstrap stop后报错。

对于catalina.sh里面的就是这一句:

echo "0000002"
"$_RUNJAVA" $LOGGING_MANAGER $JAVA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" stop
echo "0000003"


3.3.2 再次等5分钟,再bash -x看执行详细过程:

[root@ptbin]# bash -x catalina.sh stop
+ JAVA_OPTS='-Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -Xloggc:/logs/gc/9300.gc'
+ CATALINA_PID=/var/tomcat/9300.pid
+ cygwin=false
+ os400=false
+ darwin=false
+ case "`uname`" in
++ uname
+ PRG=catalina.sh
+ '[' -h catalina.sh ']'
++ dirname catalina.sh
+ PRGDIR=.
+ '[' -z '' ']'
++ cd ./..
++ pwd
+ CATALINA_HOME=/usr/local/app/apache-tomcat-6.0.37_9300
+ '[' -z '' ']'
+ CATALINA_BASE=/usr/local/app/apache-tomcat-6.0.37_9300
+ CLASSPATH=
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setenv.sh ']'
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setenv.sh ']'
+ false
+ false
+ false
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh ']'
+ BASEDIR=/usr/local/app/apache-tomcat-6.0.37_9300
+ . /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh
++ '[' -z /usr/lib/jvm/java -a -z '' ']'
++ '[' -z /usr/lib/jvm/java -a stop = debug ']'
++ '[' -z '' ']'
++ JRE_HOME=/usr/lib/jvm/java
++ '[' stop = debug ']'
++ '[' -z /usr/local/app/apache-tomcat-6.0.37_9300 ']'
++ '[' '!' -x /usr/local/app/apache-tomcat-6.0.37_9300/bin/setclasspath.sh ']'
++ '[' -z '' ']'
++ JAVA_ENDORSED_DIRS=/usr/local/app/apache-tomcat-6.0.37_9300/endorsed
++ JIKESPATH=
+++ uname -s
++ '[' Linux = Darwin ']'
++ _RUNJAVA=/usr/lib/jvm/java/bin/java
++ '[' false '!=' true ']'
++ _RUNJDB=/usr/lib/jvm/java/bin/jdb
+ '[' -z /usr/local/app/apache-tomcat-6.0.37_9300 ']'
+ '[' '!' -z '' ']'
+ '[' /usr/local/app/apache-tomcat-6.0.37_9300 '!=' /usr/local/app/apache-tomcat-6.0.37_9300 ']'
+ CLASSPATH=/usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
+ '[' -z '' ']'
+ CATALINA_OUT=/usr/local/app/apache-tomcat-6.0.37_9300/logs/catalina.out
+ '[' -z '' ']'
+ CATALINA_TMPDIR=/usr/local/app/apache-tomcat-6.0.37_9300/temp
+ have_tty=0
++ tty
+ '[' /dev/pts/1 '!=' 'not a tty' ']'
+ have_tty=1
+ false
+ '[' -z '' ']'
+ '[' -r /usr/local/app/apache-tomcat-6.0.37_9300/conf/logging.properties ']'
+ LOGGING_COnFIG=-Djava.util.logging.config.file=/usr/local/app/apache-tomcat-6.0.37_9300/conf/logging.properties
+ '[' -z '' ']'
+ LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+ '[' 1 -eq 1 ']'
+ echo 'Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300'
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
+ echo 'Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300'
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
+ echo 'Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp'
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
+ '[' stop = debug ']'
+ echo 'Using JRE_HOME: /usr/lib/jvm/java'
Using JRE_HOME: /usr/lib/jvm/java
+ echo 'Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar'
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ echo 'Using CATALINA_PID: /var/tomcat/9300.pid'
Using CATALINA_PID: /var/tomcat/9300.pid
+ '[' stop = jpda ']'
+ '[' stop = debug ']'
+ '[' stop = run ']'
+ '[' stop = start ']'
+ '[' stop = stop ']'
+ shift
+ SLEEP=5
+ '[' '!' -z '' ']'
+ FORCE=0
+ '[' '' = -force ']'
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ '[' -f /var/tomcat/9300.pid ']'
+ '[' -s /var/tomcat/9300.pid ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 0 -gt 0 ']'
+ echo 0000002
0000002
+ /usr/lib/jvm/java/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx1024m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -Xloggc:/logs/gc/9300.gc -Djava.endorsed.dirs=/usr/local/app/apache-tomcat-6.0.37_9300/endorsed -classpath /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar -Dcatalina.base=/usr/local/app/apache-tomcat-6.0.37_9300 -Dcatalina.home=/usr/local/app/apache-tomcat-6.0.37_9300 -Djava.io.tmpdir=/usr/local/app/apache-tomcat-6.0.37_9300/temp org.apache.catalina.startup.Bootstrap stop
+ echo 0000003
0000003
+ '[' '!' -z /var/tomcat/9300.pid ']'
+ echo CATALINA_PID:/var/tomcat/9300.pid
CATALINA_PID:/var/tomcat/9300.pid
+ '[' -f /var/tomcat/9300.pid ']'
+ '[' 5 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 0 -gt 0 ']'
+ '[' 5 -gt 0 ']'
+ sleep 1
+ '[' 5 -eq 0 ']'
++ expr 5 - 1
+ SLEEP=4
+ '[' 4 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 0 -gt 0 ']'
+ '[' 4 -gt 0 ']'
+ sleep 1
+ '[' 4 -eq 0 ']'
++ expr 4 - 1
+ SLEEP=3
+ '[' 3 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 0 -gt 0 ']'
+ '[' 3 -gt 0 ']'
+ sleep 1
+ '[' 3 -eq 0 ']'
++ expr 3 - 1
+ SLEEP=2
+ '[' 2 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 0 -gt 0 ']'
+ '[' 2 -gt 0 ']'
+ sleep 1
+ '[' 2 -eq 0 ']'
++ expr 2 - 1
+ SLEEP=1
+ '[' 1 -ge 0 ']'
++ cat /var/tomcat/9300.pid
+ kill -0 23685
+ '[' 1 -gt 0 ']'
+ rm -f /var/tomcat/9300.pid
+ '[' 0 '!=' 0 ']'
+ break
+ '[' 0 -eq 1 ']'

对比下3.3.1代码报错的代码以及bash执行结果命令,

"$_RUNJAVA" $LOGGING_MANAGER $JAVA_OPTS \
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
-Dcatalina.base="$CATALINA_BASE" \
-Dcatalina.home="$CATALINA_HOME" \
-Djava.io.tmpdir="$CATALINA_TMPDIR" \
org.apache.catalina.startup.Bootstrap "$@" stop

的执行结果都是一样的,没有差别,所以就是说问题在于执行catalina.sh stop的时机问题,那么这个时机不对,就会造成stop失败。在经过几次测试后,发现在以下几种情况会造成tomcat类似的错误:

(1)是由于tomcat还没有启动完成的时候,你去执行shutdown.sh会报错,这个时候不允许stop,会报错。
(2)当tomcat上的web工程正在执行一项任务的时候,tomcat会等待不允许你stop也会保错的。
(3)其它未知原因。



4,解决办法


4.1 加上-force参数,再启动后关闭,就不会报错

[root@ptbin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
Using JRE_HOME: /usr/lib/jvm/java
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
Using CATALINA_PID: /var/tomcat/9300.pid
[root@ptbin]#

4.2 等待一会再shutdown.sh等tomcat里面web工程执行完的时候,没有新请求了,shutdown就ok了。

[root@ptbin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_HOME: /usr/local/app/apache-tomcat-6.0.37_9300
Using CATALINA_TMPDIR: /usr/local/app/apache-tomcat-6.0.37_9300/temp
Using JRE_HOME: /usr/lib/jvm/java
Using CLASSPATH: /usr/local/app/apache-tomcat-6.0.37_9300/bin/bootstrap.jar
Using CATALINA_PID: /var/tomcat/9300.pid
[root@ptbin]#


推荐阅读
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本文将深入探讨Java编程语言中顶级类`Object`的源码实现,旨在为Java新手提供进阶指导。`Object`类是所有Java类的基类,了解其内部机制对于提升编程技能至关重要。文章首先介绍了API文档的使用方法,这对于有开发经验的Java程序员来说是不可或缺的工具。通过详细解析`Object`类的关键方法和属性,读者可以更好地理解Java的核心原理和设计思想。此外,文章还提供了实际代码示例,帮助读者在实践中掌握这些知识。 ... [详细]
  • 在Linux环境中,通过编写Shell脚本来实现自定义命令的创建与激活,能够极大地简化服务器上多个子系统的管理操作。例如,通过简单的命令如“tt”,即可快速查看各个应用程序的名称及其运行状态,从而提高系统维护的效率和便捷性。 ... [详细]
  • Android数组截取技巧及JNI数组交互在仓库构建中的应用分析
    在Android开发中,数组截取技巧和JNI数组交互在仓库构建中的应用具有重要意义。JNI提供了两种主要的数组处理方法:一是生成原生层数组的副本,二是直接通过数组指针进行操作。在进行字符串处理时,如果需要执行其他复杂操作,可以结合这两种方法以提高效率和灵活性。此外,合理利用这些技术可以显著提升应用程序的性能和稳定性。 ... [详细]
  • 本文深入探讨了JVM的核心机制,重点解析了堆内存与栈内存的功能与特性。JVM栈主要负责程序的执行流程,包括方法调用和数据处理;而JVM堆则专注于数据的存储管理,主要用于存放对象实例。栈内存中存储的是基本数据类型以及堆中对象的引用,确保了程序在运行时能够高效地访问和操作数据。 ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • 本文介绍了C语言中指针的基础知识及其初步应用。首先,文章详细解释了如何定义变量和指针,例如通过 `int i, j, k;` 定义整型变量,以及使用 `int *pi, *pj, *pk;` 来声明指向整型数据的指针。接着,探讨了变量和指针的初始化方法,强调了正确的初始化对于避免程序错误的重要性。此外,还简要介绍了指针在数组、函数参数传递等场景中的基本应用,为初学者提供了全面的入门指导。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 无法将文件下载到AWSLambda ... [详细]
author-avatar
郝蕾雅老_206
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有