Não, o systemd não tem recurso interno para isso.
Assim como no Upstart, você terá que chamar um shell.
Tenho vários projetos diferentes que já contêm serviços Upstart e estou implementando a abordagem para vincular esses serviços em /etc/init
diretamente de uma cópia de trabalho do SVN. O Upstart fornece scripts incorporados nos quais eu sou capaz de 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 qualquer caminho absoluto para minhas cópias de trabalho, mas simplesmente confio 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 furar o máximo possível aos seus conceitos sugeridos, o que parece não suportar scripts embutidos da maneira que eu usei anteriormente.
Eu já sei que systemctl enable /usr/local/.../someApp.service
me permite manter minha definição de serviço na cópia de trabalho do SVN . A única coisa que estou sentindo atualmente é adotar corretamente minha abordagem readlink
para não precisar codificar um caminho absoluto. Eu já li sobre especificadores , mas pelo que entendi, eles não fornecem informações caminhos e não resolver links simbólicos.
Além disso, eu sou capaz de executar diretamente shells com uma linha de comando adicional e, em teoria, incorporar minha abordagem readlink
lá. Mas isso parece feio.
Outra abordagem que tenho em mente é algum script dispatcher em todo o sistema, já tenho algum /usr/local/vendor
em todo o sistema, para o qual eu poderia encaminhar especificadores e implementar minha abordagem readlink
externamente.
Mas há algo mais fácil que estou perdendo? Algo simples como o seguinte, em que %f
seria o destino do link simbólico resolvido:
ExecStart = %f/../../bin/someApp.pl
O que parece ser mais fácil do que os exemplos a seguir:
ExecStart = /bin/sh -c "..."
ExecStart = /usr/local/vendor/systemd/dispatcher "%f"
Obrigado!
Tags bash symbolic-link systemd linux