Dienst konnte nicht gestartet werden

15

Ich habe einen systemd-Dienst erstellt:

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mine.service

Ich legte es in den Ordner / etc / systemd / system und nannte es mine.service.

Wenn ich renne sudo service mine start, gibt es mir:

Fehler beim Starten von mine.service.Unit mine.service nicht gefunden

--- UPDATE -----

Ich laufe zuerst sudo systemctl daemon-reloadund jetzt gibt es mir keine Nachrichten, aber der Dienst startet immer noch nicht.

George
quelle
10
Haben Sie systemctl daemon-reloadnach dem Erstellen Ihrer Unit-Datei ausgeführt?
Wieland
@Wieland: Hmm..Jetzt werden mir keine Nachrichten angezeigt. Aber es startet immer noch nicht.
George
@don_crissti: Der Status besagt, dass es aktiv ist, aber das Skript (in ExecStart) wird nicht ausgeführt.
George
wie würde es das richtige $ HOME kennen? Was erwarten Sie von einem Systemdienst?
Serge
@ Serge: Hmm..so, wie kann ich $ HOME benutzen?
George

Antworten:

14

$HOMEverweist auf das Basisverzeichnis des Benutzers, der das Skript ausführt. Systemd-Dienste werden mit root gestartet, dies wird wahrscheinlich versucht /root/theFolder/run.sh. Verwenden Sie absolute Pfade in Servicedateien.

Sie haben auch die forkingOption gesetzt. Dies wird für das Programm benötigt, das sich im Hintergrund befindet. Tut Ihr Skript dies? Die meisten tun dies nicht, und wenn dies bei Ihnen nicht der Fall ist, sollten Sie diese Option entfernen, oder systemd wartet darauf, dass Ihr Skript beendet wird, um es als gestartet zu beanspruchen.

Auch Systemdienstdateien, die auf Skripte in Ihrem Home-Verzeichnis verweisen, sind nicht empfehlenswert und möglicherweise ein Sicherheitsrisiko. Da sie als Root ausgeführt werden, kann jeder, der sie ändern kann, möglicherweise Root-Zugriff auf Ihren Computer erhalten. Es ist weitaus besser, das Skript zu kopieren /usr/local/binund sicherzustellen, dass es im Besitz des Benutzers ist und nur von root geschrieben werden kann, um dies zu verhindern. Es ist auch eine gute Idee, das Skript unter Verwendung der Optionen User=und Group=in der Servicedatei als nicht privilegierter Benutzer auszuführen .

Wenn Sie es als Benutzer ausführen möchten, ist es besser, die Servicedatei einzutragen ~/.config/systemd/user/und sie mit zu starten / zu aktivieren systemctl --user enable yourservice && systemctl --user start yourservice(beachten Sie, dass Sie als Benutzer ausgeführt werden, der nicht root ist). Sehen Sie diese für weitere Informationen über Benutzer - Service - Dateien.

Michael Daffin
quelle
: Ich stelle das Skript in / usr / local / bin und den Dienst in /.config/systemd/user.Wenn ich versuche, den Dienst zu aktivieren, werden "überschüssige Argumente" angezeigt .. Einheit .. ', so etwas.
George
Können Sie die vollständigen Befehle und detaillierteren Protokolle bereitstellen? Es ist schwer mit Fragmenten zu debuggen.
Michael Daffin
: Gibt es eine Lösung für die Verwendung des $ HOME-Pfads? Wenn ich das Skript in / usr / local / bin lege, werden relative Pfade zu $ ​​HOME verwendet. Ich habe dies gesehen. Und ich habe versucht, HOME=$HOMEdie erste Umgebungsdatei einzufügen . Aber der Dienst konnte nicht gestartet werden, keine Fehler.
George
1
auf ubuntu musste ich systemctl verwenden, nicht systemd, mit systemd bekam ich eine Fehlermeldung "Excess Arguments"
Alexander Mills
1
@AlexanderMills Sie haben Recht, der richtige Befehl in systemctl und systemd war nur ein Tippfehler in der Antwort.
Michael Daffin