Как мне удалить bash из служебного файла systemd? и заменить его чем-то, что решает мою проблему, описанную ниже?
Скучные детали оповещения: у меня есть systemd
service
файл, который использует 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
Если он делает свою работу и выходит, вам нужно
type=oneshot
Если он продолжает работать на переднем плане (то есть "зависает" до тех пор, пока его не убьют), вам нужно
type=simple
Если он сразу возвращается с работающим в фоновом режиме демоном, то вам нужно
type=forking
Если это третье, вы также должны поставить
PIDFile=/path/to/service/pidfile
Если первое, что вам нужно
RemainAfterExit=yes