Назад | Перейти на главную страницу

Как отладить модуль systemd ExecStart

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

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

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

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

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

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

В файле * .service в разделе [Service]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'