Como evitar um caminho absoluto para um executável no systemd?

Como evitar um caminho absoluto para um executável no systemd?

Tenho vários projetos diferentes que já contêm serviços Upstart e estou implementando a abordagem para vincular esses serviços /etc/initdiretamente a partir de uma cópia de trabalho do SVN. O Upstart fornece scripts incorporados nos quais posso simplesmente ler o destino do meu link simbólico e executar scripts adicionais ou o executável do próprio serviço. O importante para minha configuração é apenas a seguinte linha:

cd "$(dirname "$(dirname "$(readlink "/etc/init/${UPSTART_JOB}.conf")")")"

Dessa forma, não preciso codificar nenhum caminho absoluto para minhas cópias de trabalho, mas simplesmente confiar no link simbólico e em algum layout de diretório relativo definido de meus vários projetos. Eu gostaria de implementar a mesma abordagem para o systemd, mas me ater o máximo possível aos conceitos sugeridos, que parecem não suportar scripts incorporados como eu usava anteriormente.

Eu já sei que isso systemctl enable /usr/local/.../someApp.serviceme permitemanter minha definição de serviço na cópia de trabalho do SVN. A única coisa que sinto falta no momento é adotar adequadamente minha readlinkabordagem para não precisar codificar um caminho absoluto. Eu li sobreespecificadoresjá, mas pelo que entendi eles não fornecem caminhos absolutos e não resolvem links simbólicos.

Além disso, sou capaz de executar shells diretamente com uma linha de comando adicional e, em teoria, incorporar minha readlinkabordagem lá. Mas isso parece feio.

Outra abordagem que tenho em mente é algum script de despachante para todo o sistema, já tenho alguns para todo o sistema /usr/local/vendor, para os quais poderia encaminhar especificadores e que implementam minha readlinkabordagem externamente.

Mas há algo mais fácil que estou perdendo? Algo simples como o seguinte, onde %festaria o alvo do link simbólico resolvido:

ExecStart = %f/../../bin/someApp.pl

O que parece mais fácil do que os seguintes exemplos:

ExecStart = /bin/sh -c "..."

ExecStart = /usr/local/vendor/systemd/dispatcher "%f"

Obrigado!

Responder1

Não, o systemd não possui nenhum recurso integrado para isso.

Assim como no Upstart, você terá que chamar um shell.

informação relacionada