Você deve ser capaz de fazer um script de várias linhas, por exemplo,
ExecStart=/bin/bash -c '\
source /opt/environmentname/bin/activate environmentname; \
exec /var/programname/programname -f /etc/programname/programconfig.conf'
Eu tenho um aplicativo que precisa usar a fonte de comando para configurar seu arquivo de ambiente.
[Unit]
Description=Programname
After=syslog.target network.target
[Service]
User=root
ExecStartPre=source /opt/environmentname/bin/activate enviromentname
ExecStart=/var/programname/programname -f /etc/programname/programconfig.conf
[Install]
WantedBy=multi-user.target
Agora, o Systemd reclama sobre o código-fonte porque esse não é um caminho absoluto e o código-fonte é um componente do bash, então eu tentei
ExecStartPre=/bin/bash -c "source /opt/environmentname/bin/activate enviromentname"
O fato de executarmos o script com a fonte, em vez de chmod + x, é devido aos requisitos do fornecedor.
Então, há uma maneira de fazer isso funcionar? Ou precisamos trabalhar com bifurcação ou algo assim?
Como podemos usar o builtin bash corretamente dentro dos arquivos da unidade Systemd?
Você deve ser capaz de fazer um script de várias linhas, por exemplo,
ExecStart=/bin/bash -c '\
source /opt/environmentname/bin/activate environmentname; \
exec /var/programname/programname -f /etc/programname/programconfig.conf'
Para entender isso ... o ExecStart
depende do ambiente definido por esse comando? Como essas linhas não são realmente executadas no mesmo shell, você não pode esperar que elas compartilhem o ambiente. O que você precisa é usar a palavra-chave Environment
no arquivo da unidade. Dessa forma, o ExecStart
irá obter o ambiente definido pelo seu arquivo.