Cómo depurar la unidad systemd ExecStart

12

Tengo curiosidad por saber si puedo imprimir la ExecStart/ExecStoplínea de comandos completamente expandida . Considere el siguiente ejemplo:

ExecStart=/usr/bin/java $OPTS_COMMON $OPTS $OPTS_LOG $OPTS_DEBUG some.class.Start --param1 ${PARAM1} --param2 ${PARAM2}

Tengo líneas de comando bastante largas con muchas variables de entorno involucradas. Si algunas de las variables se vuelven incorrectas (por ejemplo, mediante la configuración directa), es posible que el servicio no se inicie en absoluto. Sin embargo, no veo una línea completamente expandida con envs sustituidos en ningún lado y lucho por descubrir qué está mal.

No tuve suerte buscando en Google esto y hasta ahora la única posibilidad que encontré es modificar el archivo de la unidad para que se ejecute en /usr/bin/echolugar del servicio en sí. Pero eso es un poco agotador. O incluso una solución más molesta: compruebe cada variable de entorno una por una.

¿Hay alguna forma de obligar a systemd a mostrarme lo que realmente se intenta ejecutar?

pístole
fuente

Respuestas:

9

Lamentablemente no hay construido en el camino. Para ver el ExecStart final, puede activar la depuración. Edite el archivo /etc/systemd/system.confy configúrelo LogLevel=en debug. Entonces verás algo como:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Esto no resuelve su problema, pero es bueno ver el reemplazo del especificador del sistema. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

Pero si realmente desea llegar al final del reemplazo de argumentos, debe buscar aquí: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Umut
fuente
Tenía un poco de miedo de que no hay forma de hacerlo. :/ Gracias de cualquier manera.
Pístole
2

En el archivo * .service en la sección [Servicio]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
greenif
fuente