Ich habe ein benutzerdefiniertes Skript zum Einbinden von Google Drives.
Teil dieses Skripts ist der folgende Code:
if [ ! "$(which google-drive-ocamlfuse)" ]
then
echo "Install google-drive-ocamlfuse first!"
exit 1
fi
Vom Terminal aus ausgeführt, funktioniert einwandfrei.
Also habe ich es als Dienst konfiguriert:
[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
Leider wird mir beim Überprüfen des Dienststatus der Exitcode „Installieren Sie zuerst Google Drive-Ocamlfuse!“ angezeigt.
Befehlwelches Google Drive-Ocamlfuseunter Benutzer und Root erhalte ich einen gültigen Pfad:
$ which google-drive-ocamlfuse
/home/<usernamehere>/.opam/default/bin/google-drive-ocamlfuse
Wo ist das Problem?
Antwort1
Das Problem besteht darin, dass das Skript, wenn es als Dienst ausgeführt wird, nicht als „Sie“ ausgeführt wird: Es verfügt nicht über Ihre Umgebung. Genauer gesagt verfügt es nicht über Ihre PATH
Variable.
Fügen Sie entweder /home/<usernamehere>/.opam/default/bin
den Pfad in Ihrem Skript hinzu oder codieren Sie einfach den vollständigen Pfad für dieses Programm fest.
Antwort2
Der wahrscheinlichste Grund ist, dass sich das Verzeichnis, das es enthält, google-drive-ocamlfuse
in PATH
Ihrer Anmelde-Shell befindet, jedoch nicht im PATH
von verwendeten Standard systemd
.
Fügen Sie einfach am Anfang Ihres Skripts eine Zeile wie diese hinzu:
PATH=$PATH:/path/to/google-drive-ocamlfuse
Antwort3
Vielen Dank an alle für die Lösungen. Jede ist für mich wichtig und hilfreich – ich habe wieder etwas Neues gelernt. Am Ende habe ich mich entschieden, google-drive-ocamlfuse von deb aus zu installieren, statt über opam. Es ist besser, gdo in einem für alle Benutzer verfügbaren Pfad zu installieren. Aus diesem Grund ist eine zusätzliche Konfiguration von $PATH nicht erforderlich.
Antwort4
Notiz:Ich habe diese Antwort so belassen, wie sie ist, aber der einzige relevante Teil ist, wie die Umgebung über die Servicedatei und nicht direkt im Skript festgelegt wird. Das Festlegen eines neuen $PATH im Skript bleibt nicht bestehen, nachdem das Skript ausgeführt wurde.
In Bezug auf die anderen Antworten: Bitte verunreinigen Sie Ihr Skript nicht $PATH
, indem Sie es bearbeiten, denn es funktioniert tatsächlich, wenn es vom richtigen Benutzer ausgeführt wird. Wenn Sie es direkt im Skript bearbeiten müssen, stellen Sie es anschließend wieder her, indem Sie das Original wiederherstellen $PATH
.
Ich denke, das Problem liegt darin, dass /etc/profile nicht von systemd-Diensten verarbeitet wird und daher aus irgendeinem Grund keinen Zugriff (oder keinen aktualisierten $PATH) für die erforderliche ausführbare Datei hat.
Um dies zu testen, können Sie $PATH innerhalb des Fehlerblocks ausgeben und es, falls es fehlt, direkt in die Umgebungsvariable in der systemd-Dienstdatei einfügen:
[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Auf diese Weise wird der Pfad für das Skript nur während der Ausführung aktualisiert und nicht für Benutzer geändert, die nicht mit einer Änderung rechnen.