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