Como depurar a unidade systemd ExecStart

12

Estou curioso para saber se posso imprimir uma ExecStart/ExecStoplinha de comando totalmente expandida . Considere o seguinte exemplo:

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

Estou tendo linhas de comando bastante longas com muitas variáveis ​​de ambiente envolvidas. Se algumas das variáveis ​​ficarem erradas (por exemplo, na configuração drop-in), o serviço poderá não ser iniciado. No entanto, não vejo uma linha totalmente expandida com envs substituídos em lugar algum e luto para descobrir o que está errado.

Eu não tive sorte pesquisando isso no Google e até agora a única possibilidade que encontrei é modificar o arquivo da unidade para executar em /usr/bin/echovez do próprio serviço. Mas isso é um pouco cansativo. Ou uma solução ainda mais irritante - verifique todas as variáveis ​​de ambiente, uma por uma.

Existe alguma maneira de forçar o systemd a me mostrar o que realmente está tentando ser executado?

pistola
fonte

Respostas:

9

Infelizmente, não existe um caminho construído. Para ver o ExecStart final, você pode ativar a depuração. Edite o arquivo /etc/systemd/system.confe defina LogLevel=como debug. Então você verá algo como:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Isso não resolve o seu problema, mas é bom ver a substituição do especificador do systemd. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(especificadores)

Mas se você realmente quiser chegar ao fundo da substituição de argumentos, precisa procurar aqui: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Umut
fonte
Eu estava com um pouco de medo de que não havia como fazê-lo. : / Obrigado mesmo assim.
pystole
2

No arquivo * .service na seção [Serviço]

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