Comment déboguer l'unité Systemd ExecStart

12

Je suis curieux de savoir si je peux imprimer une ExecStart/ExecStopligne de commande entièrement développée . Prenons l'exemple suivant:

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

J'ai des lignes de commande assez longues avec beaucoup de variables d'environnement impliquées. Si certaines variables deviennent erronées (par exemple par une configuration sans rendez-vous), le service peut ne pas démarrer du tout. Cependant, je ne vois nulle part une ligne entièrement élargie avec des envs substitués et j'ai du mal à découvrir ce qui ne va pas.

Je n'ai pas eu de chance sur Google et jusqu'à présent, la seule possibilité que j'ai trouvée est de modifier le fichier d'unité pour qu'il fonctionne /usr/bin/echoau lieu du service lui-même. Mais c'est un peu fatigant. Ou encore une solution plus ennuyeuse - vérifiez chaque variable d'environnement une par une.

Existe-t-il un moyen de forcer systemd à me montrer ce qui est réellement tenté d'être exécuté?

pystole
la source

Réponses:

9

Malheureusement, il n'y a aucun moyen intégré. Pour voir le ExecStart final, vous pouvez activer le débogage. Modifiez le fichier /etc/systemd/system.confet définissez le LogLevel=sur debug. Ensuite, vous verrez quelque chose comme:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Cela ne résout pas votre problème mais il est bon de voir le remplacement du spécificateur de systemd. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

Mais si vous voulez vraiment aller au fond du remplacement d'argument, vous devez regarder ici: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Umut
la source
J'avais un peu peur qu'il n'y ait aucun moyen de le faire. :/ Merci quand même.
Pystole
2

Dans le fichier * .service de la section [Service]

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