15

我无法在我的 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

有任何想法吗?

4

1 回答 1

8

更新

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

它是一堆插入符号编码的控制字符,可以解码如下:

前 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 二进制文件。

然后,我下载了 JRE 的 32 位版本(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 位版本的 Java(与您的 Tomcat 捆绑),该机器不能(或配置)运行 32 位可执行文件。还有一个 shell 问题(如下所述),然后掩盖了潜在的问题,这就是为什么你会收到这个看起来很奇怪的错误消息。

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


...

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

特别是已知旧版本的dash在 ENOEXEC(即损坏和/或无效架构二进制文件)的情况下将二进制数据作为 shell 脚本执行(参见https://bugs.debian.org/cgi-bin/bugreport.cgi?错误=816313;味精=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.sh中的shebang行,如下所示:

#!/bin/bash

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

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

/home/tomcat/jdk1.8.0_121/bin/java
于 2017-02-08T12:30:47.997 回答