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 PATH
variável.
Adicione /home/<usernamehere>/.opam/default/bin
ao 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-ocamlfuse
está no PATH
seu shell de login, mas não no padrão PATH
usado 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 $PATH
editando 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.