Синтаксическая ошибка после развертывания SpringBoot jar как службы в Ubuntu 14.04.1 - PullRequest
0 голосов
/ 09 июля 2019

У меня есть веб-приложение springboot, упакованное в виде файла jar.И продуктовый сервер Ubuntu 14.04.1 с установленным openjdk-8-jdk.

Я могу успешно запустить приложение, используя:

sudo java -jar /home/myUser/my_web_app.jar

Затем я делаю это приложение в качестве службы SystemVследующие команды:

sudo useradd webUser
sudo passwd webUser
sudo chown webUser:webUser /home/myUser/my_web_app.jar
sudo chmod 500 /home/myUser/my_web_app.jar
sudo ln -s /home/myUser/my_web_app.jar /etc/init.d/my_web_app

После этого при запуске:

sudo service my_web_app start

И ошибка возникает как:

/etc/init.d/my_web_app: 1: /etc/init.d/my_web_app: Syntax error: ")" unexpected.

Интересно, что вызывает эту ошибку и какчтобы восстановить это.Спасибо.

Кстати, этот же метод работает на моей машине для разработчиков (Ubuntu 14.04.6).

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Проблема состоит в том, что эти две строки:

sudo chmod 500 /home/myUser/my_web_app.jar
sudo ln -s /home/myUser/my_web_app.jar /etc/init.d/my_web_app

Проблема № 1: обычные исполняемые файлы JAR не являются исполняемым форматом, который ОС распознает 1 .

Установка бита выполнения для обычного файла JAR не поможет.Ядро ОС не знает, как его запустить.Чтобы запустить обычный JAR, вам нужно выполнить команду java -jar /path/to/the.jar.При необходимости вы можете создать простой скрипт-обертку для этого.

1 - Существует способ создать специальный «полностью исполняемый» JAR-файл SpringBoot, к которому добавлен сценарий оболочки;см. «Установка приложений Spring Boot» .Это один из способов обойти эту проблему, хотя в документации говорится, что эти специальные JAR-файлы вызывают проблемы у некоторых инструментов.

Проблема №2: Файлы в /etc/init.dдолжны быть служебными скриптами.

Они не просто исполняемые файлы для службы.Сценарии, как предполагается, являются сценариями оболочки, которые понимают глаголы, такие как start, stop, restart, reload и так далее.И (AFAIK) они должны быть закодированы как sh совместимые сценарии оболочки.Вот статья, которая описывает структуру служебных сценариев:

(но сначала прочитайте проблему №4 !!)

Проблема # 3 : Запуск службы с именем root может быть угрозой безопасности.

Для запуска службы лучше создать (непривилегированную) учетную запись службы.Это особенно важно, если сервис открыт для сети.(Если злоумышленники могут «взломать» службу по сети и заставить ее делать нежелательные вещи, тот факт, что она работает от имени пользователя root, ставит под угрозу всю систему.)

Проблема № 4: /etc/init.d/ сценарии устарели.

Если вы используете последний выпуск Ubuntu (15.04 или более поздний), эти сценарии /etc/init.d/ являются «устаревшим» способом настройки.Текущая итерация механизма initd - systemd.Он использует systemd файлы файлов модулей, а не служебные скрипты.Следующая статья дает дополнительную информацию:

Служба systemd включает устаревшие сценарии службы, но они не такие мощные, гибкие и ..сжато ... как файлы модулей.

Задача № 5: Ubuntu 14.04 LTS достиг конца срока службы.

Вам следует обновить систему до 16.04 LTS или предпочтительно до 18.04 LTS.Неразумно использовать операционную систему с истекшим сроком эксплуатации для ваших производственных серверов.


Обратите внимание, что имеется много документации и множество статей в Интернете о старых и старыхновые способы настройки сервисов.(Google твой друг.)

0 голосов
/ 21 июля 2019

Большое спасибо @Stephne C за подробный ответ.После некоторого поиска я обнаружил, что весенняя загрузка предлагает стандартную практику обслуживания Здесь для Ubuntu и CentOS.

Основная ошибка, которую я сделал, - не упаковывать мой проект в качестве исполняемого файла jar.

Чтобы сделать Springboot JAR исполняемым, отредактируйте POM-файл, добавьте тег <executbale> в <configuration> тег spring-boot-maven-plugin как blow:

<project>
   ...
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
               <executable>true</executable>
            </configuration>
         </plugin>
         ...
      </plugins>
   </build>
   ...
</project>

Упакуйте и загрузите новый исполняемый файлjar для сервера

chown jar для пользователя nologin, служба будет запускаться его владельцем.

chmod 500 jar для предоставления ему исполняемого разрешения.

добавить мягкую ссылку на /etc/init.d, чтобы зарегистрировать ее как службу.

запустить службу, пока что все хорошо.

Но как @Stephen CПри этом параметр по умолчанию не является ни достаточно безопасным, ни очень современным.Я думаю, что лучше просто упаковать толстую банку и настроить сервис вручную в производственной среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...