¿Obteniendo PID de dependencia en systemd?

¿Obteniendo PID de dependencia en systemd?

Me gustaría escribir un archivo de unidad systemd que deba pasar al comando ejecutivo el PID de una de sus dependencias. En el archivo de la unidad me gustaría tener:

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

¿Existe alguna manera de obtener el PID de una dependencia requerida de alguna manera sencilla? No se pudo encontrar nada en el manual ni un ejemplo en ninguno de los archivos de la unidad en un escritorio Ubuntu.

El caso de uso es crear un archivo unitario simple que se pueda usar para adjuntar el demonio JProfiler a un servicio basado en Java para realizar una depuración remota del rendimiento. El comando para conectar el generador de perfiles necesita el PID de la JVM.

Respuesta1

Deman systemctl:

-p,--property=

Al mostrar propiedades de unidad/trabajo/gerente con elespectáculocomando, limite la visualización a las propiedades especificadas en el argumento. El argumento debe ser una lista de nombres de propiedades separados por comas,como " MainPID". [...]

Entonces systemctl show -p MainPID foose mostrará MainPID=<pid>(en lugar de solo el pid). Usando un --valueparámetro adicional (o combinado -P(mayúscula) para lo suficientemente recientesistemad) proporcionará solo el valor:

--value

Al imprimir propiedades con show, imprima solo el valor y omita el nombre de la propiedad y "=". Consulte también la opción -P arriba.

Agregado en la versión 230.

Entonces si el serviciofoopuede identificarse por su PID principal (es decir, el proceso objetivo no es en realidad un subproceso del pid principal), esto podría usarse:

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

Si no en su propio guión, uno puedeuse el prefijo :antes de la línea ejecutable para evitar cualquier análisis desistemad:

Prefijo Efecto
... ...
":" Si la ruta ejecutable tiene el prefijo ":", no se aplica la sustitución de variables de entorno (como se describe en la sección "Líneas de comando" a continuación).
... ...

manteniéndolo así igual en el archivo de servicio:

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

información relacionada