Eu tenho um systemd
serviço rodando sob um usuário específico.
Eu assumi erroneamente que o serviço teria acesso às variáveis de ambiente que todos os usuários herdam de scripts/exportações em/etc/profile.d
Existe uma maneira de fazer isso sem ter que copiar manualmente as variáveis na systemd
definição do arquivo de unidade.
Por exemplo, tenho o seguinte
$ cat /etc/profile.d/somexports
export VAR1=VALUE1
export VAR2=VALUE2
Isso pode ser passado/exportado para um systemd
serviço?
Existem algumas fontes possíveis de ambiente:
Environment=
que permite definir variáveisEnvironmentFile=
que permite carregar valores de um arquivoPassEnvironment=
o que permite definir variáveis que devem ser passadas de PID1.$USER
)Pode parecer que
EnvironmentFile=/etc/profile.d/someexports
é o que você quer, mas esse não é o caso./etc/profile.d/*
é frequentemente originado pelo seu shell e pode ser analisado pelo seu shell.systemd
é agnóstico do shell e, portanto, não dependerá da sintaxe do bash. OEnvironmentFile
deve conter atribuições de variáveis separadas por nova linha, que são mais estritas.systemd
O design do desencoraja a mudança dinâmica de unidades ou seus ambientes. Mesmo aEnvironmentFile=
opção só foi adicionada como resultado de pressão e mais tarde foi considerada um erro pelossystemd
desenvolvedores do . Um exemplo desse design é que$PATH
não afeta quais binários são usados. Isso mantém as coisas mais determinísticas, pois quando você define uma unidade, você está definindo tudo sobre como essa unidade deve funcionar sem se preocupar com influências externas.A resposta tão curta é: Não. você não pode carregar
/etc/profile.d/*
esystemd
isso é intencional.Mas a resposta que você provavelmente quer é: sim, você pode carregá-lo. Você só precisa executar seu aplicativo por meio de um shell.
Você pode fazer isso alterando:
Para
Isso fará com
bash
que seja o processo pai, que carrega/etc/profile.d/
e encaminha esse ambiente para seu filho. Observe também que não especifiquei um caminho absoluto completo paramyservice
. Neste caso,myservice
será baseado em$PATH
e que pode ou não ser/usr/bin/myservice
. Você pode ver como isso pode tornar as coisas mais difíceis de solucionar e essa é a desvantagem de seguir esse caminho.Eu acho que isso é abordado da seguinte forma
O
-l
sinalizador torna a invocação do shell um shell de login.