Ich versuche derzeit, den Unterschied zwischen init.d
und Cron @reboot
für das Ausführen eines Skripts beim Start / Booten des Systems zu verstehen .
Die Verwendung von @reboot
(diese Methode wurde in diesem Forum von hs.chandra erwähnt ) ist etwas einfacher, indem Sie einfach in ein gehen crontab -e
und ein erstellen @reboot /some_directory/to_your/script/your_script.txt
und dann your_script.txt
jedes Mal ausgeführt werden, wenn das System neu gestartet wird. Eine ausführliche Erklärung @reboot
dazu finden Sie hier
Alternativ können Sie Folgendes /etc/init.d/your_script.txt
in die zweite Zeile Ihres Skripts einbetten :
#!/bin/bash
# /etc/init.d/your_script.txt
Sie können ausführen, chmod +x /etc/init.d/your_script.txt
und das sollte auch dazu führen, dass es your_script.txt
bei jedem Systemstart ausgeführt wird.
F1: Was sind die Hauptunterschiede zwischen den beiden?
F2: Welches ist robuster?
Frage 3: Gibt es eine bessere von beiden?
F4: Ist dies die richtige Methode zum Einbetten eines Skripts, das beim Booten ausgeführt werden soll?
Ich werde eine Bash .sh-Datei einbinden, die während des Startvorgangs ausgeführt werden soll.
Antworten:
init.d
Das auch als SysV-Skript bezeichnete Skript dient zum Starten und Beenden von Diensten während der Systeminitialisierung und des Herunterfahrens. (Aus/etc/init.d/
Kompatibilitätsgründen werden Skripts auch auf systemd-fähigen Systemen ausgeführt.)start
und undstop
und unterstützen (siehe Debian-Politik )crontab
(und deshalb@reboot
).@reboot
Skript hinzufügen (nicht nur root)multi-user.target
./etc/rc.local
wird oft als hässlich oder veraltet angesehen (zumindest von RedHat ), hatte aber dennoch einige nette Features:rc.local
war (fast) der letzte Dienst, der gestartet wurde.rc.local
wirdnetwork.target
standardmäßig danach ausgeführt (nichtnetwork-online.target
!)Lesen Sie in Bezug auf systemd
network.target
und Ausführen von Diensten, nachdem das Netzwerk aktiv ist .network-online.target
quelle
/var/run/crond.reboot
jedes Mal eine Datei entfernen , wenn bei jedem Systemstart @reboot-Cron-Jobs ausgeführt werden sollen. Wenn diese Datei existiert, werden @reboot cron-Jobs nicht ausgeführtErstens ist eine Klarstellung angebracht:
httpd
oder steuerncron
In Bezug darauf, ob es besser ist, Ihr Skript zu verwenden
rc.local
odercron
auszuführen, vermute ich, dass es eher eine Frage der Ästhetik als der Praktikabilität ist.cron
ist als Taskplaner eine Methode zur Durchführung von Wartungs- oder Instandhaltungsarbeiten an einem Computer, z. B. zur Überprüfung von Updates, zur Bereinigung von Caches oder zur Durchführung von Sicherheitsüberprüfungen. Dies bedeutet nicht, dass es auf die Ausführung dieser Funktionen beschränkt ist, da jedes Skript oder jeder Befehl ausgeführt werden kann, der zum angegebenen Zeitpunkt gewünscht wird (z. B.@reboot
).Mit
rc.local
auf der anderen Seite würde fällt mehr innerhalb einer Systemkonfiguration Art der Aufgabe, wierc.local
von den Maschinen ausgeführt wurde System init, ist in der Regel verantwortlich für die Maschinen - Netzwerk Konfigurationseinstellung, Dienstleistungen oder Umgebungen (aber auch hier sind einfach nicht darauf beschränkt diese Aufgabe).Beide Punkte sollten jedoch durch die Tatsache gemildert werden, dass nicht alle init-Systeme einen
rc.local
Mechanismus und nicht alle cron-Daemons einen@reboot
psuedo-Tag bieten .Bonuspunkte
Wie bereits erwähnt,
init.d
ist dies das Verzeichnis, das die Skripts enthält, die Dienste steuern, die auf Ihrem System gestartet oder gestoppt werden können (zumindest auf Computern, die einSysV
System vom Typ init verwenden). Abhängig von Ihrem Init-System und dem Zweck Ihres Skripts kann es sinnvoll sein, Ihr Skript in ein Init-Skript zu konvertieren , das auf die gleiche Weise wie ein Dienst ausgeführt wird. Dies hängt jedoch stark von Ihrem Init-System ab, da das Framework für die Erstellung dieser Dateien sehr unterschiedlich sein kann.Letztes Wort
Es sollte auch beachtet werden, dass Bash-Skripte normalerweise mit einem Suffix von
.sh
anstatt enden.txt
, da dies sofort anzeigt, dass die Datei ein Shell-Skript anstelle einer Textdatei ist. Davon abgesehen , vorausgesetzt, es hat entweder ein shebang (#!/bin/bash
) am Anfang der Datei oder heißt sobash /path/to/script.whatever
, sollte es für die Ausführung des Skripts keine Rolle spielen.quelle
bash
Skripte enden normalerweise nicht mit einer Erweiterung (und sollten dies wohl auch nicht tun )sh
..sh
statt.txt
". Dies bedeutet, dass diesh
Dateinamenerweiterung für Bash-Skripte (oder andere Shell-Skripte) genauer ist als fürtxt
Klartext. Sie können jede Erweiterung verwenden, die Sie zum Kichern bringt. Eine übliche Konvention wäre jedoch, wenn die Verwendung einer Erweiterungsh
angemessener wäre und häufig verwendet wird. Dies ist jedoch nicht erforderlich, insbesondere für Skripte, die von der ausgeführt werden sollenPATH
.Ich schreibe meine Antwort unten;
Abgesehen von den Unterschieden, die oben von anderen Benutzern erwähnt wurden, möchte ich den Punkt hervorheben, dass @reboot vom crond-Daemon abhängig ist. Sie sind abhängig von der Reihenfolge, in der crond beginnt. In den meisten Fällen fängt crond zwar gut an, kann aber manchmal nicht starten (zumindest habe ich in einigen meiner Projekte Fehler festgestellt). Wenn Sie ein Init-Skript schreiben, tritt in der Regel ein Fehler auf, wenn Sie in Ihrem Skript etwas falsch machen (ein Beispiel: Verlassen auf einen Dienst, der nach Ihrem Dienst gestartet wird).
Aufgrund der obigen Ausführungen denke ich, dass init robuster ist. Aber es gibt noch einen anderen Punkt, wie er von "Franklin Piat" in der ersten Antwort erwähnt wurde. Normalerweise benötigen Sie ein Init-Skript für einen Daemon und sollten die Richtlinien befolgen
Ich glaube nicht (rc.local ist ein bisschen alt und veraltet)
Ja. Normalerweise machen Application- / Package-Writer das so.
quelle