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?
Antworten:
Zusätzlich zu dem, was TokyoMEWS selbst gefunden hat ...
(was nicht ganz korrekt ist - wird
Type=forking
nur notwendig, wenn Ihr Skript beendet wird, während seine untergeordneten Elemente ausgeführt werden )... andere mögliche Probleme sind:
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 .
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[email protected]
).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.quelle
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 .
quelle