Je suis curieux de savoir si je peux imprimer entièrement développé ExecStart/ExecStop
ligne de commande. 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 étendue 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 exécuter /usr/bin/echo
au 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é?
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.conf
et définissez le LogLevel=
à 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 (spécificateurs)
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#L257
Dans le fichier * .service de la section [Service]
ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'