Bash-script como servicio Linux no se ejecuta, pero ejecutado desde la terminal funciona perfectamente

Bash-script como servicio Linux no se ejecuta, pero ejecutado desde la terminal funciona perfectamente

Tengo un script personalizado para montar unidades de Google.
Parte de este script es el siguiente código:

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

Ejecutado desde la terminal, funciona a las mil maravillas.
Entonces lo configuré como servicio:

[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

Desafortunadamente, veo el código de salida: "¡Instale google-drive-ocamlfuse primero!" cuando verifico el estado del servicio.

Dominiocual google-drive-ocamlfusebajo usuario y root me da una ruta válida:

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

¿Dónde está el problema?

Respuesta1

El problema es que, cuando el script se ejecuta como servicio, no se ejecuta como "usted": no tiene su entorno. Específicamente, no tiene su PATHvariable.

Agregue /home/<usernamehere>/.opam/default/bina la RUTA en su secuencia de comandos o simplemente codifique la ruta completa para ese programa.

Respuesta2

La razón más probable es que el directorio que lo contiene google-drive-ocamlfusese encuentra en el PATHshell de inicio de sesión, pero no en el estándar PATHutilizado por systemd.

Simplemente agregue una línea como esta al comienzo de su secuencia de comandos:

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

Respuesta3

Gracias a todos por las soluciones. Cada uno de ellos es importante y útil para mí; nuevamente aprendí algo nuevo. Al final decidí instalar google-drive-ocamlfuse desde deb, en lugar de hacerlo a través de opam. Es mejor instalar gdo en la ruta disponible para todos los usuarios. Debido a esto, no es necesaria una configuración adicional de $PATH.

Respuesta4

Nota:Dejé esta respuesta "tal cual", pero la única parte relevante es cómo configurar el entorno a través del archivo de servicio, en lugar de hacerlo directamente en el script. Establecer un nuevo $PATH en el script no persistirá una vez que el script haya terminado de ejecutarse.

En referencia a las otras respuestas, no contamine $PATHeditando su script, cuando en realidad funciona si lo ejecuta el usuario correcto. Si debe editarlo directamente en el script, vuelva a colocarlo restaurando el archivo original $PATH.

Creo que el problema radica en el hecho de que /etc/profile no es procesado por los servicios systemd y, por lo tanto, por algún motivo no ha obtenido acceso (o una $PATH actualizada) para el ejecutable requerido.

Para probar esto, puede hacer eco de $PATH dentro del bloque de error y, si falta, agregarlo directamente a la variable de entorno dentro del archivo de servicio systemd:

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

De esta manera, la ruta solo se actualiza para el script mientras se ejecuta, no la modifica para los usuarios que no esperan que se modifique.

información relacionada