Мы можем записать pid в файл, которые хранят в systemd?

У меня есть сценарий для запуска JAVA-приложения на времени начальной загрузки.

[Unit]
Description=test Background

[Service]
ExecStart=/bin/bash -c "/usr/bin/java -jar /var/www/tset.com/*.jar"
Type=simple
WorkingDirectory=/var/www/test.com

[Install]
WantedBy=multi-user.target

Мы можем отредактировать это для записи pid в файл в определенном месте?

Как пример,

ExecStart=/bin/bash -c "/usr/bin/java -jar /var/www/test.com/*.jar | echo $! > ${RUNNING_PID}"
2
задан 17 December 2018 в 06:21

3 ответа

Путем я приблизился бы, этой проблемой является этот путь:

ExecStart=/bin/bash -c 'echo $$ > /var/run/tset.pid; exec /usr/bin/java -jar /var/www/tset.com/*.jar'

Существует пара вещей, которые требуют внимания:

  • то, что Вы пытаетесь сделать, должно записать .pid файл, который содержит PID процесса, и на Linux "фактическое" местоположение, должен поместить его в /var/run

  • > оператор для перенаправления stdout из echo, который будет содержанием $$ или оболочка PID.

  • Почему оболочка PID? Ну, поэтому следующая вещь, которую мы используем, exec команда, которая заменит процесс оболочки Вашим JAVA-приложением. То, что было оболочкой представления PID 1234, теперь будет JAVA-приложением представления 1234 года.

Такой подход, в то время как кажется замысловатым, является на самом деле более соответствующим:

  • мы знаем PID вместо использования ps или pgrep для нахождения его мы не должны применять сложный парсинг, ни у нас есть проблема, если существует несколько экземпляров приложения уже, работающего (который не должен иметь место, если Вы используете systemd сервис для запуска его, но нет никакого вреда в составлении возможности этого также),
  • и с exec ресурсы не будут потрачены впустую для запуска нескольких процессов. Когда у Вас есть что-то как bash -c '/usr/bin/java -jar myapp.jar & pgrep -f myapp.jar > /var/run/myapp.pid ' это - 3 процесса. В вышеупомянутой предложенной команде - у нас есть один процесс, заменяющий другого.

Конечно, это - просто пример. Корректируйтесь как необходимый для Вашего случая, и /var/run/tset.pid выбран здесь в качестве примера - именование ваше дело, а также местоположение файла, хотя я рекомендовал бы использовать /var/run для непротиворечивости с другими приложениями.

Примечание стороны:

| echo $! > ${RUNNING_PID}" часть не была бы соответствующей по крайней мере по одной причине: ${RUNNING_PID} переменная, однако она не объявляется нигде, таким образом, это был бы замененный доской в оболочке. | бессмысленно - stdout из JAVA-приложения подключен с stdin из echo который в случае, если то, где Вы хотите вывод заявления, посланного в другое приложение, является соответствующим, но эхо не читает stdin - т.е. здесь это бессмысленно.

Конечно, если само приложение (т.е. JAVA-приложение) ветвления - т.е. создает - другой процесс $$ не поможет многому, хотя быть совершенно справедливым, если приложение действительно создает несколько ветвлений затем, это, вероятно, должно быть задание самого приложения, чтобы создать и справиться .pid файл и сообщает об основном pid процесса.

2
ответ дан 2 December 2019 в 02:12

Необходимо смочь выполнить Java непосредственно вместо того, чтобы выполнить оболочку удара, которая выполняет Java. Если Вы делаете это, можно выполнить выставочную команду systemctl для получения PID

systemctl show -p MainPID <your service name>

предположение, конечно, что JAVA-приложение не создает больше процессов.

Если Ваш сервисный файл названия заканчивается в .service затем, можно опустить суффикс .service от <your service name>

Если Вы будете работать с помощью сценария удара затем, то Вы получите pid оболочки удара, это выполняет Ваш процесс Java.

2
ответ дан 2 December 2019 в 02:12

systemd оставляет pid Вашего процесса на среде, таким образом, можно использовать его на сценарии:

    [Unit]

    [Service]
    ExecStart=/home/blah/my-process.sh
    ExecStop=/bin/kill -HUP $MAINPID
    PIDFile=/home/blah/blah.pid

    [Install]
0
ответ дан 2 December 2019 в 02:12

Другие вопросы по тегам:

Похожие вопросы: