Importar variável PATH para a unidade systemd

1

Eu tenho um serviço systemd que se parece com isso:

[Unit]
Description=Kcrypt Backend Webpack Bundler
After=network.target

[Service]
User=kenny
Environment=NODE_ENV=PROD
WorkingDirectory=/var/www/kcrypt-api/
ExecStart=/var/www/kcrypt-api/scripts/webpack.sh

[Install]
WantedBy=multi-user.target

O arquivo .sh é assim:

#!/usr/bin/env bash

export NODE_ENV=DEV

rm ./dist/* -rf

yarn start webpack --watch 

O problema é que não é possível encontrar yarn .

Meu usuário é chamado de kenny . kenny tem uma ferramenta chamada nvm instalada que gerencia nodejs versões. Essa ferramenta adiciona um diretório à variável PATH env editando '~ / .bashrc'.

Isso significa que o comando yarn só estará disponível se o usuário estiver logado como kenny .

Fiquei com a impressão de que, se eu definir o usuário de systemd 'co_de%' como 'kenny', unit cuidará do resto ou não sei o que eu estava pensando .

Existe alguma maneira de importar a variável PATH de systemd para o kenny systemd ?

    
por Hristo Kolev 01.04.2018 / 11:47

2 respostas

1

Em vez de tentar 'referenciar a variável PATH ' de um usuário, você deve definir PATH manualmente, ou mais apropriadamente, usar o caminho completo para o binário.

That means that the yarn command is only available if the user is logged in as kenny

Isso não é exato. Significa apenas que yarn não está instalado em um local referenciado pela variável PATH usada pelo systemd e provavelmente em um local personalizado ou local fora da variável PATH padrão.

Quando você estiver logado como kenny , use which yarn para imprimir o caminho para yarn e, em seguida, certifique-se de usá-lo ao fazer referência a ele no script.

    
por 03.04.2018 / 16:30
0
O

bash só irá fornecer ~/.bashrc se você o estiver executando como um shell interativo, ele não fará isso se você estiver simplesmente executando o bash para um script.

Considerando que systemd está apenas executando o bash como o interpretador do script webpack.sh (na verdade, ele nem sabe que o bash está envolvido, o kernel o executa como o intérprete da linha #!), então não é um shell interativo e nenhum arquivo de inicialização é lido.

Você pode contornar isso ao pesquisar ~/.bashrc explicitamente no início do seu script webpack.sh , assumindo que tudo em que há segurança seja executado em um shell não interativo. (Deve estar bem.)

Portanto, considere adicionar esta linha ao início do seu script:

. ~/.bashrc
    
por 04.04.2018 / 06:59

Tags