我们正在将应用程序从 tomcat 7 迁移到 tomcat 8。所有 war 都在 tomcat 8 中成功部署。但只有 1 个 war 未部署。 Tomcat 8开始部署战争,然后就卡在那里了。 Catalina.out 和 Error.log 中没有打印日志。
请查找以下日志。
23-May-2018 04:14:55.314 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.5.31
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 27 2018 20:24:25 UTC
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.5.31.0
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-693.21.1.el7.x86_64
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/java/jdk1.8.0_60/jre
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_60-b27
23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /opt/apache-tomcat-8.5.31
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /opt/apache-tomcat-8.5.31
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/opt/tomcat
23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/opt/tomcat
23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/opt/tomcat/temp
23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]
23-May-2018 04:14:55.644 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
23-May-2018 04:14:55.675 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
23-May-2018 04:14:55.706 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
23-May-2018 04:14:55.708 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
23-May-2018 04:14:55.720 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1282 ms
23-May-2018 04:14:55.755 WARNING [main] org.apache.tomcat.jdbc.pool.ConnectionPool.checkPoolConfiguration maxIdle is smaller than minIdle, setting maxIdle to: 5
23-May-2018 04:14:57.653 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
23-May-2018 04:14:57.654 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.31
23-May-2018 04:14:57.711 INFO [localhost-startStop-1] **org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/apache-tomcat-8.5.31/webapps/llas.war]**
这是 Catalina.out 中的最后一行。
如果您仍然需要帮助。
如果您使用的是虚拟机,请尝试在文件 setenv.sh 中设置 Djava.security.egd=file:/dev/./urandomns
将此作为一个问题提出可能并不像评论和链接资源中描述的那么明显。虽然我的问题的症状与此处已经提到的非常相似,但我认为原因可能有所不同。
请务必注意,日志从未包含任何错误 阻止启动; Tomcat 简单地冻结了 CPU 使用率 100%。
我们有一个可在带有 JDK 1.8 的 Tomcat 9 上运行的 Web 应用程序。我们决定启用 Java 安全管理器,在授予所有模式中利用专业级库。我不会深入研究所使用的特定规则和整个 Tomcat 配置,因为 Tomcat 安装(包括 Java 安全管理器)是从另一台服务器上已运行的应用程序克隆的。两台服务器都是运行 Oracle Linux Server 6 的虚拟机。
唯一进行的更改是在 bin/setenv.sh 脚本中,我们在其中配置了变量以启用 Java 安全管理器。
JDK:/opt/jdk1.8.0_201/ Tomcat:Apache Tomcat/7.0.27
注意:这个示例可能并不理想,因为它是运行 Tomcat 7 的开发机器,这可能是导致此错误发生的一个因素...
$ cat bin/setenv.sh
#!/bin/sh
CLASSPATH=$CLASSPATH:$CATALINA_HOME/lib/pro-grade-1.1.1-verbose.jar
JAVA_OPTS="$JAVA_OPTS -Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM -Djava.security.properties=file:$CATALINA_HOME/conf/SecurityManager/custom_java.security"
# Important! this one allows grant policy
JAVA_OPTS="$JAVA_OPTS -Dprograde.use.own.policy=true"
进程列表中生成的启动命令:
tomcat 35603 0.4 52.1 13509904 1967628 ? Sl Aug22 15:43
/usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/apache-tomcat-7.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM
-Djava.security.properties=file:/opt/tomcat/apache-tomcat-7.0.27/conf/SecurityManager/custom_java.security
-Dprograde.use.own.policy=true
-Xms128m -Xmx3G -XX:MaxPermSize=1024M -XX:MaxPermSize=1024M -Dfile.encoding=UTF-8
-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7777 -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.1.2 -Dcom.sun.management.jmxremote.authenticate=false
-Djava.endorsed.dirs=/opt/tomcat/apache-tomcat-7.0.27/endorsed
-classpath :/opt/tomcat/apache-tomcat-7.0.27/lib/pro-grade-1.1.1-verbose.jar:/opt/tomcat/apache-tomcat-7.0.27/bin/bootstrap.jar:/opt/tomcat/apache-tomcat-7.0.27/bin/tomcat-juli.jar
-Dcatalina.base=/opt/tomcat/apache-tomcat-7.0.27 -Dcatalina.home=/opt/tomcat/apache-tomcat-7.0.27 -Djava.io.tmpdir=/opt/tomcat/apache-tomcat-7.0.27/temp
org.apache.catalina.startup.Bootstrap start
NB 此应用程序已成功从服务调用或使用 bin/catalina.sh 手动启动
start() {
daemon --user tomcat "/opt/tomcat/apache-tomcat-7.0.27/bin/startup.sh"
}
JDK:/usr/java/jdk1.8.0_201/(最终更新为381) Tomcat:Apache Tomcat/9.0.22
bin/setenv.sh: cloned configuration from working app above
/etc/init.d/tomcat: same as above
进程列表中生成的启动命令(从服务调用):
tomcat 10529 100 19.4 3987040 347372 ? Sl 11:47 14:05
/usr/java/jdk1.8.0_381/bin/java
-Djava.util.logging.config.file=/opt/storage/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM
-Djava.security.properties=file:/opt/storage/tomcat/conf/SecurityManager/custom_java.security
-Dprograde.use.own.policy=true
-Xms512M -Xmx1536M -Djava.security.egd=file:/dev/./urandom
-Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Djdk.tls.maxHandshakeMessageSize=38096
-Dignore.endorsed.dirs=
-classpath :/opt/storage/tomcat/lib/pro-grade-1.1.1-verbose.jar:/opt/storage/tomcat/bin/bootstrap.jar:/opt/storage/tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/opt/storage/tomcat -Dcatalina.home=/opt/storage/tomcat -Djava.io.tmpdir=/opt/storage/tomcat/temp
org.apache.catalina.startup.Bootstrap start
您可以注意到该进程的 cpu 使用率为 100%。该日志与问题中提供的日志类似 — Tomcat 在部署 WAR 文件期间冻结。为了说明这一点,我把它放在这样的状态一天,但没有发生任何变化。
随后,我尝试以 root 用户身份直接调用它,导致同样的冻结。
下一步是尝试以 tomcat 用户(非登录用户)的身份直接调用它。令人惊讶的是,它成功了。
tomcat 11135 61.5 36.1 4171984 644204 ? Sl 12:07 0:44
/usr/java/jdk1.8.0_381/jre/bin/java
-Djava.util.logging.config.file=/opt/storage/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xms512M -Xmx1536M -Djava.security.egd=file:/dev/./urandom
-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM
-Djava.security.properties=file:/opt/storage/tomcat/conf/SecurityManager/customt_java.security
-Dprograde.use.own.policy=true
-Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djdk.tls.maxHandshakeMessageSize=38096 -Dignore.endorsed.dirs=
-classpath :/opt/storage/tomcat/lib/pro-grade-1.1.1-verbose.jar:/opt/storage/tomcat/bin/bootstrap.jar:/opt/storage/tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/opt/storage/tomcat -Dcatalina.home=/opt/storage/tomcat -Djava.io.tmpdir=/opt/storage/tomcat/temp
org.apache.catalina.startup.Bootstrap start
24-Aug-2023 19:20:48.368 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/storage/tomcat/webapps/preprod] has finished in [35,712] ms
24-Aug-2023 19:20:48.380 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [39,923] milliseconds
那么,接下来会发生什么——文件权限错误?! 我修改了服务脚本来启动 Tomcat,就像我以 tomcat 用户身份调用它一样,但它再次冻结了...
现在是时候消除启动脚本配置中的差异了。 ...
简而言之,在新服务器上,通过删除类路径中前置的冒号来修复 Tomcat 启动问题。有趣的是,它在开发服务器上正常运行(尽管使用 Tomcat 7),尽管官方的类路径条目分隔符是 分号。
tomcat 16506 0.6 34.0 9488308 1381516 ? Sl Aug24 3:03 /usr/bin/java
-Djava.util.logging.config.file=/opt/storage/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM
-Djava.security.properties=file:/opt/storage/tomcat/conf/SecurityManager/custom_java.security
-Dprograde.use.own.policy=true
-Djdk.tls.ephemeralDHKeySize=2048 -Xms512M -Xmx2048M -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n -Xms512M -Xmx1024M -Dignore.endorsed.dirs=
-classpath /opt/storage/tomcat/lib/pro-grade-1.1.1-verbose.jar:/opt/storage/tomcat/bin/bootstrap.jar:/opt/storage/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/storage/tomcat -Dcatalina.home=/opt/storage/tomcat -Djava.io.tmpdir=/opt/storage/tomcat/temp
org.apache.catalina.startup.Bootstrap start
附注如果您有任何有关此错误的实际原因的线索,请发表评论。