Bash-script como linux-service não será executado, mas executado a partir do terminal funciona perfeitamente

Bash-script como linux-service não será executado, mas executado a partir do terminal funciona perfeitamente

Eu tenho um script personalizado para montar o Google Drives.
Parte deste script é o seguinte código:

if [ ! "$(which google-drive-ocamlfuse)" ]
then
    echo "Install google-drive-ocamlfuse first!"
    exit 1
fi

Executado a partir do terminal, funciona perfeitamente.
Então, configurei como serviço:

[Unit]
Description=Mount and umount google drives

[Service]
User=<usernamehere>
Type=oneshot
RemainAfterExit=true
ExecStart=/home/<usernamehere>/mybscripts/gdrivemounter.sh -m
ExecStop=/home/<usernamehere>/mybscripts/gdrivemounter.sh -u
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/<usernamehere>/.Xauthority"

[Install]
WantedBy=graphical.target

Infelizmente, vejo o código de saída: "Instale o google-drive-ocamlfuse primeiro!" quando verifico o status do serviço.

Comandoqual google-drive-ocamlfusesob usuário e root me fornece um caminho válido:

$ which google-drive-ocamlfuse
/home/<usernamehere>/.opam/default/bin/google-drive-ocamlfuse

Onde está o problema?

Responder1

O problema é que, quando o script roda como um serviço, ele não roda como “você”: ele não tem o seu ambiente. Especificamente, não possui sua PATHvariável.

Adicione /home/<usernamehere>/.opam/default/binao PATH no seu script ou simplesmente codifique o caminho completo para esse programa.

Responder2

O motivo mais provável é que o diretório que contém google-drive-ocamlfuseestá no PATHseu shell de login, mas não no padrão PATHusado pelo systemd.

Basta adicionar uma linha como esta no início do seu script:

PATH=$PATH:/path/to/google-drive-ocamlfuse

Responder3

Obrigado a todos pelas soluções. Cada um é importante e útil para mim - mais uma vez aprendi algo novo. No final decidi instalar o google-drive-ocamlfuse do deb, em vez do opam. É melhor instalar o gdo no caminho disponível para todos os usuários. Devido a isso, não é necessária configuração adicional de $PATH.

Responder4

Observação:Deixei esta resposta 'como está', mas a única parte relevante é como definir o ambiente por meio do arquivo de serviço, em vez de diretamente no script. Definir um novo $PATH no script não persistirá após a conclusão da execução do script.

Em referência às outras respostas, não polua $PATHeditando seu script, quando na verdade ele funciona se executado pelo usuário correto. Se você precisar editá-lo diretamente no script, coloque-o de volta restaurando o arquivo $PATH.

Acho que o problema está no fato de que /etc/profile não é processado pelos serviços do systemd e, por qualquer motivo, não obteve acesso (ou um $PATH atualizado) para o executável necessário.

Para testar isso, você pode repetir $PATH dentro do bloco de erro e, se estiver faltando, adicione-o diretamente na variável Environment no arquivo de serviço systemd:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Dessa forma, o caminho só é atualizado para o script enquanto ele é executado, não o modifica para usuários que não esperam que ele seja modificado.

informação relacionada