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

Мне любопытно, могу ли я распечатать в развернутом виде 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 показать мне, что на самом деле пытались запустить?

3 ответа

Решение

К сожалению нет встроенного пути. Чтобы увидеть окончательный вариант 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

Вместо использования командной строки для выполнения используйте сценарий-оболочку (или двоичный файл) с той же командой и параметрами. Затем сценарий-оболочка записывает параметры и затем выполняет настоящую команду.

Так:

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

Сам скрипт-оболочка может быть:

      #!/bin/sh
LOGFILE=/some/safe/file
for param
do
    echo "param: $param"
done > $LOGFILE
exec "$@"

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

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
Другие вопросы по тегам