Systemd kann das Skript nicht starten

6080
TokyoMEWS

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 erstellt, die meiner Meinung nach die erforderlichen Informationen enthält:

[Unit] Description=My Script After=network.target  [Service] ExecStart=/home/myscript.sh  [Install] WantedBy=multi-user.target 

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

Der Systemctl-Status gibt an, dass das Skript erfolgreich ausgeführt und beendet wurde. Trotzdem hat das Skript keine Wirkung. Wenn ich das Skript von einer Shell aus laufe, funktioniert es einwandfrei.

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

8
Anscheinend, wenn Ihr Skript etwas anderes startet, braucht es "Type = Forking". Ich fühle mich etwas dumm, weil ich mich nicht mit den Einstellungen beschäftigt habe. TokyoMEWS vor 12 Jahren 3
+1, um es zu lösen. Bitte posten Sie Ihre Lösung als Antwort und akzeptieren Sie sie, um anderen Menschen mit dem gleichen Problem zu helfen. terdon vor 12 Jahren 1
@TokyoMEWS: Genauer gesagt, wenn das Skript etwas anderes startet und beendet **, während seine Kinder laufen, muss es "Type = forking" sein. grawity vor 12 Jahren 1

2 Antworten auf die Frage

7
grawity

Zusätzlich zu dem, was TokyoMEWS für sich gefunden hat ...

Anscheinend, wenn Ihr Skript etwas anderes startet, benötigt es "Type = forking".

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

... andere mögliche Probleme sind:

  1. Ich vermute, mit "Anzeige auf dem Bildschirm" meinten Sie, dass das Skript einfach etwas in stdout schreibt. Dies wird beim Booten nicht auf dem Bildschirm angezeigt - vielmehr wird alles vom Standardausgang eines Service an das Journal gesendet (oder je nach Ihrer systemd-Version an syslog).

  2. Wenn Sie haben tatsächlich Schreiben auf dem 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 zeigt. (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 mit Lese- und Schreibzugriff versehen sein. Hierfür After=local-fs.target kann es erforderlich sein, ansonsten kann das Gerät zu früh wieder gestartet werden. Dies hängt jedoch von der spezifischen Betriebssystemkonfiguration ab.

1
ibai

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

[Service] ExecStart=/home/myscript.sh start ExecStop=/home/myscript.sh stop RemainAfterExit=yes