Как мне удалить bash из служебного файла systemd? и заменить его чем-то, что решает мою проблему, описанную ниже?

Скучные детали оповещения: у меня есть systemdservice файл, который использует bash-файл для запуска сервиса. Ниже находится служебный файл, о котором идет речь:

[Unit]
Description=A program service
[Service]
User=root
#change this to your workspace
WorkingDirectory=/data/acloud/repository/lib
#path to executable. 
#executable is a bash script file I created to run the application jar file
ExecStart=/data/acloud/repository/lib/program.sh
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

Ниже program.sh Я использовал в служебном файле выше:

#!/bin/bash
sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar

Если вам интересно, почему я создал однострочный сценарий bash, это потому, что я не знаю, где и как поместить параметры -XX, -Xms -Xmx в .service файл.

Даже когда служба неактивна, статус основного PID отображается как status=0/SUCCESS и в конце systemctl status вывод команды, это говорит Started a program service?? Ниже показано, как это показано:

ubuntu@ip-172-**-**-***:/data/acloud/repository/lib$ sudo systemctl status program
program.service - A program service
   Loaded: loaded (/etc/systemd/system/program.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2019-02-22 13:08:21 UTC; 45s ago
  Process: 27711 ExecStart=/data/acloud/repository/lib/program.sh (code=exited, status=0/SUCCESS)
 Main PID: 27711 (code=exited, status=0/SUCCESS)

Feb 22 13:08:21 ip-172-**-**-*** systemd[1]: Started A program service.

Я считаю, что использование bash вызывает эту проблему, так как здесь не используются коды выхода. Как мне заставить это остановиться?

1 ответ

Удалить sudo

sudo - почти всегда ошибка в системных скриптах.

  • Если блок является системным блоком, то его лишнее
  • если это не sudo, скорее всего, потерпит неудачу
  • если он используется для других целей, например -H-g и т.д., тогда systemd имеет все эти функции

Короче

$ sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar

можно заменить на

$ java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar

Теперь перемещаем его в само устройство, т.е.

Удалить сценарий оболочки

Что мешает этому работать?

ExecStart=java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar

Может быть, ничего (это просто работает!)

Но его возможные пути нуждаются в корректировке. У тебя уже есть

WorkingDirectory=/data/acloud/repository/lib

Я рекомендую заглянуть в https://www.freedesktop.org/software/systemd/man/systemd.exec.html theres. User=Group=

Ява на пути? Вы можете настроить переменную PATH env, но ее проще всего изменить на

ExecStart=/fullpath/to/java -XX:+UseG1GC -Xmx1g…

(Измените полный путь в зависимости от вас)

Это все еще работает? Я подозреваю, что нет...

Правильный тип сервиса

Так что же произойдет, если вы запустите (в оболочке) (Примечание НЕТ & в конце)

$ sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
  1. Если он делает свою работу и выходит, вам нужно

    type=oneshot
    
  2. Если он продолжает работать на переднем плане (то есть "зависает" до тех пор, пока его не убьют), вам нужно

    type=simple
    
  3. Если он сразу возвращается с работающим в фоновом режиме демоном, то вам нужно

    type=forking
    

Если это третье, вы также должны поставить

PIDFile=/path/to/service/pidfile

Если первое, что вам нужно

RemainAfterExit=yes
Другие вопросы по тегам