Ошибки Linux Tomcat

У меня возникли проблемы с запуском tomcat на моем Linux-сервере. Я запускаю 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

Любые идеи?

Ответ 1

Обновление

Я расшифровал заголовок 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.

Затем я загрузил 32-разрядную версию JRE (jre1.8.0_121) и попытался запустить java с тире, чтобы подтвердить мою теорию проблем оболочки (см. ниже), и она действительно производит точно такую ​​же ошибку сообщение у вас:

%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-разрядных исполняемых файлов. И проблема с оболочкой (как описано ниже), затем маскирует основную проблему, поэтому вы получаете это странное выглядящее сообщение об ошибке.

Трудно сказать больше, не имея более подробной информации о вашей системе, поэтому выход uname -a и cat /etc/lsb-release был бы приятным.


...

Моя ставка заключается в том, что это может быть проблема с оболочкой, т.е. ваш /bin/sh указывает на нечто вроде тире, что может вызвать некоторые проблемы совместимости с catalina.sh script и заставить интерпретировать bin/java как script вместо того, чтобы запускать его как исполняемый файл, при определенных обстоятельствах.

В частности, старые версии тире, как известно, выполняют двоичные данные в виде оболочки script в случае ENOEXEC (т.е. поврежденного и/или недопустимого двоичного кода архитектуры) (см. 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, измените строку shebang в /home/tomcat/apache -tomcat-8.5.11/bin/catalina.sh следующим образом:

#!/bin/bash

и посмотрите, помогает ли она, или, по крайней мере, создает более читаемое сообщение об ошибке.

В случае неудачи bash с cannot execute binary file проверьте, не поврежден ли ваш двоичный файл java и может быть выполнен в вашей системе, запустив его вручную:

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