
Я хотел бы написать файл юнита systemd, который должен передать команде exec PID одной из своих зависимостей. В файле юнита я хотел бы иметь:
ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service
Есть ли способ получить PID требуемой зависимости каким-то простым способом? Не удалось найти ничего в руководстве или примера в файлах юнитов на рабочем столе Ubuntu.
Вариант использования — создать простой файл модуля, который можно использовать для присоединения демона JProfiler к службе на основе Java для удаленной отладки производительности. Для команды присоединения профилировщика требуется PID JVM.
решение1
-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'