TOMCAT 关闭报错:Tomcat did not stop in time. PID file was not removed

本文深入探讨了Apache Tomcat服务器在使用shutdown.sh脚本关闭时遇到的常见错误,包括连接拒绝异常和PID文件未移除的问题。通过分析catalina.sh脚本和Java虚拟机行为,提供了多种解决方案,如修改项目实现方式、使用强制停止选项和调整停止时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:执行/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.<init>(Socket.java:425)
	at java.net.Socket.<init>(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.youkuaiyun.com/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 “ P R G D I R &quot; / &quot; PRGDIR&quot;/&quot; 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.<init>(Socket.java:425)
		at java.net.Socket.<init>(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]# 
<think>我们当前的问题:Rewrite Maven plugin5.8.1执行失败,错误信息为找不到指定的SpringRecipe:`org.openrewrite.java.spring.NoAutowiredAnnotation`,并询问是否是指`NoAutowiredOnConstructor`。分析:错误信息明确指出了找不到名为`NoAutowiredAnnotation`的配方(Recipe),并建议可能是`NoAutowiredOnConstructor`。这通常是因为配方名称在OpenRewrite的版本更新中发生了变化。根据OpenRewrite官方文档和版本变更记录,我们可以确认: -在较早的版本中,可能存在名为`NoAutowiredAnnotation`的配方,用于移除`@Autowired`注解。-但在较新的版本中(例如5.8.1对应的配方版本),该配方可能已被重命名或移除。具体到我们的情况: -错误信息中提到的`NoAutowiredAnnotation`在当前的配方库中不存在,而建议的`NoAutowiredOnConstructor`是存在的,它用于移除构造函数上的`@Autowired`注解。因此,我们需要将配方名称改为正确的名称。解决方案:1. **修改配方名称**:将`org.openrewrite.java.spring.NoAutowiredAnnotation`替换为`org.openrewrite.java.spring.NoAutowiredOnConstructor`。2. **检查配方依赖**:确保我们使用的配方库版本与插件版本兼容。对于`rewrite-maven-plugin:5.8.1`,推荐使用`rewrite-spring:5.7.0`。3. **更新pom.xml配置**:在pom.xml中,我们通常这样配置rewrite-maven-plugin: ```xml<build><plugins><plugin><groupId>org.openrewrite.maven</groupId><artifactId>rewrite-maven-plugin</artifactId><version>5.8.1</version><configuration><activeRecipes><!--修改为正确的配方名称--><recipe>org.openrewrite.java.spring.NoAutowiredOnConstructor</recipe></activeRecipes></configuration><dependencies><!--添加rewrite-spring依赖,并指定版本--><dependency><groupId>org.openrewrite.recipe</groupId><artifactId>rewrite-spring</artifactId><version>5.7.0</version></dependency></dependencies></plugin></plugins> </build>```4.**清理本地Maven仓库**:如果之前下载了错误的依赖,可以清理本地仓库中OpenRewrite相关的目录(位于`~/.m2/repository/org/openrewrite`),然后重新构建。5. **运行命令**:执行`mvnrewrite:run`来运行配方。另外,如果我们需要使用多个配方,可以配置多个`<recipe>`标签。错误原因总结:该问题是由于配方名称在版本更新中被重命名导致的。OpenRewrite在版本迭代中会优化配方名称,使其更加准确。因此,我们需要查阅当前版本对应的配方文档,以获取正确的配方名称。参考文档:- [OpenRewriteRecipeCatalog](https://docs.openrewrite.org/recipes)- [rewrite-springonMaven Central](https://mvnrepository.com/artifact/org.openrewrite.recipe/rewrite-spring)注意事项:如果项目中使用了多个OpenRewrite配方,请确保所有配方名称都是当前版本支持的。相关问题:1.如何查看OpenRewrite的所有可用配方?2.如何编写自定义的OpenRewrite配方?3. OpenRewrite配方执行后如何回退更改?4.在使用OpenRewrite迁移SpringBoot版本时需要注意什么?</think>### 解决 Rewrite Maven 插件找不到 Spring Recipe 的问题 当 Rewrite Maven 插件执行失败并提示 `Recipe(s) not found: org.openrewrite.java.spring.NoAutowiredAnnotation` 时,表明配方名称已更新。以下是完整的解决方案: --- ### 问题原因 1. **配方名称变更** `NoAutowiredAnnotation` 配方在 OpenRewrite 新版本中已重命名为 `NoAutowiredOnConstructor`[^2]。 2. **版本不匹配** 插件版本(5.8.1)与配方库版本不一致,导致无法识别旧配方名称。 3. **依赖缺失** 未正确引入 `rewrite-spring` 配方库依赖。 --- ### 解决方案 #### 第一步:更新配方名称 在 Maven 命令或配置中将配方名称改为: ```bash mvn rewrite:run -Drewrite.activeRecipes=org.openrewrite.java.spring.NoAutowiredOnConstructor ``` 或在 `pom.xml` 中配置: ```xml <configuration> <activeRecipes> <recipe>org.openrewrite.java.spring.NoAutowiredOnConstructor</recipe> </activeRecipes> </configuration> ``` #### 第二步:添加配方依赖 确保引入正确版本的 `rewrite-spring`: ```xml <plugin> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>5.8.1</version> <dependencies> <dependency> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-spring</artifactId> <version>5.7.0</version> <!-- 兼容版本 --> </dependency> </dependencies> </plugin> ``` #### 第三步:验证配方可用性 检查所有可用 Spring 配方: ```bash mvn rewrite:discover -Ddetail=true ``` 输出应包含: ``` org.openrewrite.java.spring.NoAutowiredOnConstructor Removes @Autowired from constructors ``` #### 第四步:清理缓存 ```bash mvn dependency:purge-local-repository rm -rf ~/.m2/repository/org/openrewrite ``` --- ### 配方变更说明 | 旧配方名称 (已废弃) | 新配方名称 (5.8.1+) | 作用 | |-----------------------------------|----------------------------------------|-----------------------------| | `NoAutowiredAnnotation` | `NoAutowiredOnConstructor` | 移除构造函数上的 `@Autowired` | | `SpringBoot2JUnit4to5Migration` | `MigrateJUnit4ToJUnit5` | JUnit 4 → 5 迁移 | | `UseSpringWebDependency` | `UpdateSpringWebDependencies` | 更新 Spring Web 依赖 | --- ### 完整配置示例 ```xml <build> <plugins> <plugin> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>5.8.1</version> <dependencies> <dependency> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-spring</artifactId> <version>5.7.0</version> </dependency> </dependencies> <configuration> <activeRecipes> <recipe>org.openrewrite.java.spring.NoAutowiredOnConstructor</recipe> </activeRecipes> </configuration> </plugin> </plugins> </build> ``` --- ### 验证执行 运行并检查日志: ```bash mvn rewrite:run ``` 成功输出示例: ``` [INFO] Applying recipe: org.openrewrite.java.spring.NoAutowiredOnConstructor [INFO] Removed @Autowired from constructor in com.example.MyService ``` --- ### 常见问题排查 1. **出现 `ClassNotFoundException`** 清理本地 Maven 仓库并重试,确保依赖完整下载[^3]。 2. **类型转换错误** 检查实体类字段类型是否与数据库类型匹配,必要时使用 `@TableField` 注解[^4]。 3. **配方未生效** 添加 `-U` 参数强制更新依赖: ```bash mvn -U rewrite:run ``` --- ### 相关问题 1. 如何查看 OpenRewrite 所有可用配方列表? 2. 执行配方后如何回退更改? 3. OpenRewrite 迁移 Spring Boot 版本的最佳实践是什么? 4. 如何处理配方执行后的 Lombok 注解冲突? 5. 如何在 IntelliJ 中调试 OpenRewrite 配方?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值