Jak debugować jednostkę systemową ExecStart

13

Jestem ciekawy, czy mogę wydrukować w pełni rozwiniętą ExecStart/ExecStoplinię poleceń. Rozważ następujący przykład:

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

Mam dość długie wiersze poleceń z wieloma zmiennymi środowiskowymi. Jeśli niektóre zmienne staną się niepoprawne (na przykład przez konfigurację drop-in), usługa może w ogóle się nie uruchomić. Jednak nigdzie nie widzę w pełni rozwiniętej linii z podstawionymi env i staram się dowiedzieć, co jest nie tak.

Nie miałem szczęścia googlować i do tej pory jedyną możliwą możliwością było zmodyfikowanie pliku jednostkowego, aby działał /usr/bin/echozamiast samej usługi. Ale to trochę męczące. Lub jeszcze bardziej irytujące rozwiązanie - sprawdzaj każdą zmienną środowiskową jeden po drugim.

Czy jest jakiś sposób, aby zmusić systemd do pokazania mi, co faktycznie próbuje uruchomić?

pystole
źródło

Odpowiedzi:

10

Niestety nie ma wbudowanego. Aby zobaczyć ostateczny ExecStart, możesz włączyć debugowanie. Edycja pliku /etc/systemd/system.confi ustawić LogLevel=się debug. Wtedy zobaczysz coś takiego:

java.service About to execute: /usr/bin/java $OPTS_COMMON...To nie rozwiązuje twojego problemu, ale dobrze jest zobaczyć zamiennik specyfikatora systemd. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

Ale jeśli naprawdę chcesz dostać się do sedna wymiany argumentów, musisz zajrzeć tutaj: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Umut
źródło
Trochę się obawiałem, że nie ma sposobu, jak to zrobić. : / I tak dzięki.
pystole
2

W pliku * .service w sekcji [Service]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
greenif
źródło
Nie działało dla mnie. Plik nie ma treści.
Max Leske