Ich schreibe ein Shell-Skript in Bash. Irgendwann im Skript wird festgestellt, dass der Computer neu gestartet werden muss, bevor der Vorgang fortgesetzt werden kann. Es gibt heraus:
sudo reboot
Wenn der Computer wieder hochfährt, muss dieses Skript noch mehr Arbeit erledigen. Wie konfiguriere ich etwas, um die Arbeit in diesem Skript fortzusetzen?
Ich gehe davon aus, dass ich irgendwo ein Shell-Skript schreiben kann, das beim nächsten Neustart ausgeführt wird. Wo ist so ein Ort? Ich sehe, dass Cron eine @ Reboot-Direktive hat. Ich weiß auch, dass Dienste wie Apache beim Booten von upstart gestartet werden. Wäre einer dieser Mechanismen angemessen? Wenn ja, wie würde es ausgelöst?
Dieses Skript muss nur einmal ausgeführt werden, nicht bei jedem Neustart. Es muss also irgendwohin gehen, wo es nur beim nächsten Neustart ausgeführt wird, oder es muss sich selbst entfernen können, sobald es ausgeführt wurde.
Bei dieser Frage wird gefragt, wie der Anwendungsstatus nach dem Neustart gespeichert werden soll. Mein Skript hat nicht viel Status, also kann ich das verwalten. Ich muss nur wissen, wie dieses Skript etwas auslöst, das nach dem nächsten Neustart ausgeführt wird.
Meine spezielle Version ist Ubuntu Linux 14.04. Das ursprüngliche Skript wird in der Befehlszeile von einem Systemadministrator gestartet (im Gegensatz zum Ausführen von Cron).
quelle
Antworten:
Auf einem System ist das einzige, was wirklich dauerhaft ist, eine Datei. Das ist so ziemlich das, was Sie verwenden sollten. Hier ist eine Lösung mit einem init.d-Skript.
Betrachten wir das folgende (einfache) Skript
/etc/init.d/myupdate
:Wenn Sie es mit aktivieren
update-rc.d myupdate defaults
, wird diestart
Aktion beim Booten ausgeführt. Wenn Ihr Update-Skript jetzt einen Neustart erfordert:Mit dieser Lösung können Sie Ihr Update-Skript in zwei Teile teilen:
Es wird den
before_reboot
Code-Abschnitt ausführen , eine Datei erstellen/var/run
und neu starten. Beim Booten wird das Skript erneut aufgerufen, aber da die Datei vorhanden ist,after_reboot
wird statt aufgerufenbefore_reboot
.Beachten Sie,
update-rc.d
dass Root-Rechte erforderlich sind.Ohne Verwendung einer Datei (aus Stephen Ostermillers Kommentar):
Wenn Sie mit dem
getopts
Dienstprogramm vertraut sind , möchten Sie möglicherweise Optionen anstelle von Dateien verwenden. Rufen Sie im Init-Skript das Skript auf mit:Suchen Sie in Ihrem Skript nach Optionen anstelle von Dateien. Rufen Sie Ihr Skript einmal ohne die Option auf, und init.d ruft es beim Booten erneut auf, diesmal mit
-r
.Weitere Informationen zum Umgang mit Optionen finden Sie hier (nur für kurze Optionen) . Ich habe auch mein Skript mit Aufrufen bearbeitet
update-rc.d
, um dies als einmaligen Auftrag zu behalten (aus einem anderen Kommentar).quelle
/path/to/update/script --after-reboot
aus und/etc/init.d/myupdate
nicht auf dem Vorhandensein von Berufung/var/run/rebooting-for-updates
. Dann hätte es verschiedene Argumente, wenn es direkt ausgeführt und beim Booten aufgerufen würde.update-rc.d myupdate defaults
undupdate-rc.d myupdate remove
in das Skript selbst einfügen sowie das Schreiben und Entfernen von/etc/init.d/myupdate
Dateien, damit keine Dateien herumliegen.INIT INFO
Abschnitt benötigt: wiki.debian.org/LSBInitScripts