Как отлаживать системный модуль ExecStart

12

Мне интересно, могу ли я распечатать полностью расширенную ExecStart/ExecStopкомандную строку. Рассмотрим следующий пример:

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

У меня довольно длинные командные строки с большим количеством переменных среды. Если некоторые переменные становятся неправильными (например, из-за конфигурации), служба может вообще не запуститься. Однако я нигде не вижу полностью развернутой строки с замещенными envs, и я изо всех сил пытаюсь выяснить, что не так.

Мне не повезло гуглить это, и пока единственная возможность, которую я нашел, это изменить файл модуля для запуска /usr/bin/echoвместо самой службы. Но это немного утомительно. Или еще более раздражающее решение - проверяйте каждую переменную среды по одному.

Есть ли способ заставить systemd показать мне, что на самом деле пытались запустить?

pystole
источник

Ответы:

9

К сожалению нет встроенного пути. Чтобы увидеть окончательный вариант ExecStart, вы можете включить отладку. Отредактируйте файл /etc/systemd/system.confи установите LogLevel=для debug. Тогда вы увидите что-то вроде:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Это не решит вашу проблему, но приятно видеть замену спецификатора systemd. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

Но если вы действительно хотите докопаться до замены аргумента, вам нужно посмотреть здесь: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Умут
источник
Я немного боялся, что нет способа сделать это. :/ Спасибо, в любом случае.
Пистоль
2

В * .service файле в разделе [Сервис]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
greenif
источник