У меня есть сценарий для запуска 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}"
Путем я приблизился бы, этой проблемой является этот путь:
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 года.
Такой подход, в то время как кажется замысловатым, является на самом деле более соответствующим:
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 процесса.
Необходимо смочь выполнить Java непосредственно вместо того, чтобы выполнить оболочку удара, которая выполняет Java. Если Вы делаете это, можно выполнить выставочную команду systemctl для получения PID
systemctl show -p MainPID <your service name>
предположение, конечно, что JAVA-приложение не создает больше процессов.
Если Ваш сервисный файл названия заканчивается в .service затем, можно опустить суффикс .service от <your service name>
Если Вы будете работать с помощью сценария удара затем, то Вы получите pid оболочки удара, это выполняет Ваш процесс Java.
systemd оставляет pid Вашего процесса на среде, таким образом, можно использовать его на сценарии:
[Unit]
[Service]
ExecStart=/home/blah/my-process.sh
ExecStop=/bin/kill -HUP $MAINPID
PIDFile=/home/blah/blah.pid
[Install]