Systemd kann Skript nicht starten?


9

Ich habe ein BASH-Skript, das ich beim Start ausführen möchte. Auf meinem System wird systemd ausgeführt, daher habe ich eine .service-Datei mit den meiner Meinung nach erforderlichen Informationen erstellt:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Ich habe systemctl enable verwendet, um es zu registrieren und neu zu starten. Beim Booten wurde mir mitgeteilt, dass mein Skript ausgeführt werden würde, aber ich konnte weder die Nachrichten sehen, die ECHO auf dem Bildschirm anzeigen sollte, noch etwas in eine Datei schreiben, je nachdem, was ich im Skript geschrieben hatte. Außerdem wird die Anwendung, die gestartet werden soll, nicht gestartet.

Der Systemctl-Status teilt mir mit, dass das Skript erfolgreich ausgeführt und beendet wurde. Das Skript hat jedoch keine Auswirkung. Wenn ich das Skript von einer Shell aus starte, funktioniert es einwandfrei.

Weiß jemand von euch, was mein Problem sein könnte?


3
Anscheinend, wenn Ihr Skript etwas anderes startet, das "Type = Forking" benötigt, fühle ich mich etwas dumm, weil ich nicht früher mit den Einstellungen herumgespielt habe.
TokyoMEWS

1
+1 für die Lösung. Bitte posten Sie Ihre Lösung als Antwort und akzeptieren Sie sie, um anderen Menschen mit dem gleichen Problem zu helfen.
Terdon

1
@TokyoMEWS: Genauer gesagt, wenn das Skript etwas anderes startet und beendet wird, während seine untergeordneten Elemente ausgeführt werden, benötigt es "Type = forking".
user1686

Antworten:


7

Zusätzlich zu dem, was TokyoMEWS selbst gefunden hat ...

Wenn Ihr Skript etwas anderes startet, benötigt es anscheinend "Type = Forking".

(was nicht ganz korrekt ist - wird Type=forkingnur notwendig, wenn Ihr Skript beendet wird, während seine untergeordneten Elemente ausgeführt werden )

... andere mögliche Probleme sind:

  1. Ich vermute, dass Sie mit "Anzeige auf dem Bildschirm" gemeint haben, dass das Skript einfach etwas in stdout schreibt. Dies wird während des Startvorgangs nicht auf dem Bildschirm angezeigt. Stattdessen wird alles vom Standardout eines Dienstes an das Journal (oder an das Syslog, abhängig von Ihrer Systemd-Version) gesendet .

  2. Wenn Sie haben tatsächlich Schreiben auf den Bildschirm versuchen (zB mit echo Hi >/dev/tty1), dann ist es sehr wahrscheinlich , dass die Skriptausgabe verschwindet , wenn agetty den Bildschirm löscht , bevor Anmeldungsaufforderungen zeigen. (Um dies zu vermeiden, müssten Sie das Gerät bestellen After=getty@tty1.service).

  3. Um etwas in eine Datei zu schreiben, muss das Dateisystem schreibgeschützt gemountet sein. Dies After=local-fs.target kann erforderlich sein, da das Gerät sonst möglicherweise zu früh erneut gestartet wird. Dies hängt jedoch von der jeweiligen Betriebssystemkonfiguration ab.


1

Wenn Ihr Skript auch die ExecStop- Klausel definiert , müssen Sie " RemainAfterExit = yes" festlegen , um zu verhindern , dass ExecStop nach ExecStart automatisch aufgerufen wird . Dadurch kann sich Ihr Dienst nach Ausführung des ExecStart- Befehls im Status " aktiv " befinden .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.