O serviço personalizado Systemd não lê o PATH

0

Eu estou tentando executar um aplicativo Node.js como um serviço no Debian 9. Então, seguindo alguns tutoriais, eu fiz um serviço como esse.

[Unit]
Description=bumer API Http Server
[Service]
PIDFile=/tmp/bumer-service.pid
User=root
Group=root
Restart=always
KillSignal=SIGQUIT
WorkingDirectory=/root/bumer/
SyslogIdentifier=bumer
ExecStart=/root/bumer/app.js
[Install]
WantedBy=multi-user.target

Meu aplicativo tem #!/usr/bin/env node como primeira linha e funciona muito bem se eu executar o comando /root/bumer/app.js . O problema é que quando eu inicio o serviço eu estava recebendo o seguinte erro:

main process exited, code=exited, status=127/n/a

Então, tentei alterar a primeira linha do arquivo app.js para o caminho do nó, em vez da palavra "node" #!/usr/bin/env /usr/local/lib/nodejs/node-v8.11.4/bin/node e agora ele está funcionando bem. Eu acho que o serviço não está lendo a variável PATH e eu preciso de alguma ajuda para perceber por que isso não acontece.

(meu PATH está certo e quando eu executo "tipo nó" o resultado é OK).

root@bumer:~# type node
node is /usr/local/lib/nodejs/node-v8.11.4/bin/node

(Eu estou registrando a variável PORT que eu configurei em ~ / .bashrc no app.js mas ela não pode ler também, ela registra undefined ).

    
por Lionzinho 25.09.2018 / 17:16

1 resposta

2

Os serviços não são executados em contextos de sessões de login.

Seu PATH não é correto, e o valor de PATH em um shell em uma sessão de login é completamente irrelevante, assim como os scripts de inicialização do seu shell.

Um dos recursos dos sistemas de gerenciamento de serviços (em geral, não limitado ao systemd) é que eles iniciam todos os serviços com base em um único ambiente uniforme, modificado somente por elementos da definição de serviço ( seja lá o que é). Não tem nada a ver com como os shells de login configuram ambientes de usuário para sessões de login. (Não, não é o ambiente da sessão de login do root ).

No caso do systemd, sua definição de serviço é o arquivo da unidade de serviço e, a menos que você modifique PATH nessa unidade, será qualquer valor padrão que todos os serviços sejam iniciados com . No caso do systemd, isso é documentado; e /usr/local/lib/nodejs/node-v8.11.4/bin/ não é na lista.

Se você quiser que PATH seja algo diferente do padrão all-serviecs, será necessário modificar sua unidade de serviço com Environment= settings para alterá-la.

Leitura adicional

por 25.09.2018 / 18:30