Получение PID зависимости в systemd?

Получение PID зависимости в systemd?

Я хотел бы написать файл юнита systemd, который должен передать команде exec PID одной из своих зависимостей. В файле юнита я хотел бы иметь:

ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service

Есть ли способ получить PID требуемой зависимости каким-то простым способом? Не удалось найти ничего в руководстве или примера в файлах юнитов на рабочем столе Ubuntu.

Вариант использования — создать простой файл модуля, который можно использовать для присоединения демона JProfiler к службе на основе Java для удаленной отладки производительности. Для команды присоединения профилировщика требуется PID JVM.

решение1

Отman systemctl:

-p,--property=

При отображении свойств подразделения/работы/менеджера с помощьюпоказыватькоманда, ограничить отображение свойствами, указанными в аргументе. Аргумент должен быть списком имен свойств, разделенных запятыми,такой как " MainPID". [...]

Так что systemctl show -p MainPID fooбудет отображаться MainPID=<pid>(а не только pid). Использование дополнительного --value(или комбинированного параметра -P(в верхнем регистре) для достаточно недавнихсистемд) предоставит только значение:

--value

При печати свойств с помощью show печатайте только значение и пропускайте имя свойства и «=». Также см. опцию -P выше.

Добавлено в версии 230.

Итак, если обслуживаниефуможно идентифицировать по его основному PID (т.е. целевой процесс на самом деле не является подпроцессом основного PID), это можно использовать:

/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

Если не в своем собственном сценарии, можноиспользуйте префикс :перед исполняемой строкой, чтобы избежать любого анализасистемд:

Префикс Эффект
... ...
":" Если путь к исполняемому файлу начинается с «:», подстановка переменных среды (как описано в разделе «Командные строки» ниже) не применяется.
... ...

таким образом сохраняя его в файле службы:

ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

Связанный контент