Как отлаживать системный модуль 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'