Linux Tomcat 错误

Posted

技术标签:

【中文标题】Linux Tomcat 错误【英文标题】:Linux Tomcat Errors 【发布时间】:2017-06-21 21:06:55 【问题描述】:

我无法在我的 linux 服务器上启动 tomcat。我运行 startup.sh,并获得 Tomcat Started 日志记录,但随后无法访问 localhost:8080 上的任何内容。

$CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE:   /home/tomcat/apache-tomcat-8.5.11
Using CATALINA_HOME:   /home/tomcat/apache-tomcat-8.5.11
Using CATALINA_TMPDIR: /home/tomcat/apache-tomcat-8.5.11/temp
Using JRE_HOME:        /home/tomcat/jdk1.8.0_121
Using CLASSPATH:       /home/tomcat/apache-tomcat-8.5.11/bin/bootstrap.jar:/home                                                                                        /tomcat/apache-tomcat-8.5.11/bin/tomcat-juli.jar
Tomcat started.

查看 logs/catalina.out 文件,里面有以下几行,但我一直没能找到关于这些错误的任何信息。

/home/tomcat/jdk1.8.0_121/bin/java: 1: /home/tomcat/jdk1.8.0_121/bin/java: ^?ELF^A^A^A^B^C^A: not found
/home/tomcat/jdk1.8.0_121/bin/java: 2: /home/tomcat/jdk1.8.0_121/bin/java: Syntax error: "(" unexpected

有什么想法吗?

【问题讨论】:

你能做到file /home/tomcat/jdk1.8.0_121/bin/java。看起来您的 Java 二进制文件要么不适合您的平台,要么已损坏。 @geert3 ,我同意。在我的 Intel 系统上,ELF 文件的标题不是(一次 ASCII 版)^?ELF^A^A^A^B^C - 没有检查 ELF 格式的重要性,但我怀疑它们适用于不同的平台。问题可能应该使用平台详细信息进行更新。 您能否尝试检查以下内容并报告回来。 - 你检查你下载的java二进制文件是Linux的吗?还请确保正确的架构。 - 某些程序是否覆盖了这些二进制文件。检查修改时间。 - 二进制文件是部分下载的吗? Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops? 正如其他人所建议的,这可能是由于来自不同平台的二进制文件,或者可能与 shell 脚本解析有关。进行隔离。您能否返回是否能够执行以下命令:$ /home/tomcat/jdk1.8.0_121/bin/java -version 【参考方案1】:

更新

我已经从您的错误消息中解码了 ELF 标头:^?ELF^A^A^A^B^C^A

是一堆caret encoded控制字符, 可以解码如下:

前 4 个字节是一个幻数,将文件标识为ELF 可执行文件。

0x7f (^?) - ELFMAG0 
0x45 (E)  - ELFMAG1
0x4c (L)  - ELFMAG2
0x46 (F)  - ELFMAG3

接下来的 3 个字节指定架构、字节顺序和 ELF 格式版本:

0x01 (^A) - ELFCLASS32  (i.e. this is a 32 bit binary)
0x01 (^A) - ELFDATA2LSB (Little Endian)
0x01 (^A) - EI_VERSION  (Version of ELF format EV_CURRENT/1)

所以基本上它是一个 32 位 Java 二进制文件。

然后,我下载了 32 位版本的 JRE (jre1.8.0_121),并尝试使用 dash 运行 java,以确认我的 shell 问题理论(如下),它确实会产生与您完全相同的错误消息:

%dash ./java|&less
./java: 1: ./java: ^?ELF^A^A^A^B^C^A: not found
./java: 2: ./java: Syntax error: "(" unexpected

因此,您很可能在一台无法(或配置)运行 32 位可执行文件的机器上使用 32 位版本的 Java(与您的 Tomcat 捆绑)。还有一个 shell 问题(如下所述),然后掩盖了根本问题,这就是为什么您会收到这个看起来很奇怪的错误消息。

如果没有关于您的系统的更多详细信息,很难说更多, 所以uname -acat /etc/lsb-release 的输出会很好。


...

我敢打赌,这可能是一个 shell 问题,即您的 /bin/sh 指向类似 dash 的东西,这可能会导致与 catalina.sh 脚本的一些兼容性问题,并使其在某些情况下将bin/java 解释为脚本,而不是将其作为可执行文件运行。

特别是旧版本的 dash 已知会在 ENOEXEC(即损坏和/或无效的架构二进制文件)的情况下将二进制数据作为 shell 脚本执行(参见 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=816313;msg=5)。

还有你的错误信息

/home/tomcat/jdk1.8.0_121/bin/java: 2: /home/tomcat/jdk1.8.0_121/bin/java: Syntax error: "(" unexpected

看起来很像。

您可以检查您的/bin/sh 指向的内容,如下所示:

>ls -l /bin/sh
/bin/sh -> bash

如果不是 bash,则修改 /home/tomcat/apache-tomcat-8.5.11/bin/catalina 中的 shebang 行。 sh如下:

#!/bin/bash

看看它是否有帮助,或者至少产生一个更易读的错误消息。

如果 bash 失败并显示 cannot execute binary file,请检查您的 java 二进制文件是否未损坏并且可以在您的系统上执行,手动运行它:

/home/tomcat/jdk1.8.0_121/bin/java

【讨论】:

以上是关于Linux Tomcat 错误的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊 linux + java 1.8 + tomcat8 错误

Tomcat 进程在交换空间用完后被 Linux 内核杀死;没有任何 JVM OutOfMemory 错误

在Linux系统里运行shutdown.sh命令关闭Tomcat时出现错误提示

访问tomcat下的web项目出现403错误

linux Jni调用so文件建了测试WebProject 写了一个servlet执行调用 一启动tomcat jvm崩溃了 错误日志如下

spring项目发布到linux上遇到的错