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 PATH
variable.
Agregue /home/<usernamehere>/.opam/default/bin
a 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-ocamlfuse
se encuentra en el PATH
shell de inicio de sesión, pero no en el estándar PATH
utilizado 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 $PATH
editando 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.