Ausführen eines Skripts während des Bootens / Startens; init.d vs cron @reboot

48

Ich versuche derzeit, den Unterschied zwischen init.dund Cron @rebootfü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 -eund ein erstellen @reboot /some_directory/to_your/script/your_script.txtund dann your_script.txtjedes Mal ausgeführt werden, wenn das System neu gestartet wird. Eine ausführliche Erklärung @rebootdazu finden Sie hier

Alternativ können Sie Folgendes /etc/init.d/your_script.txtin 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.txtund das sollte auch dazu führen, dass es your_script.txtbei 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.

3kstc
quelle
2
Ebenfalls relevant ist systemd, link1 link2
Rufus

Antworten:

37

init.dDas 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.)

  • Das Skript wird während des Bootens und Herunterfahrens ausgeführt (standardmäßig).
  • Das Skript sollte ein init.d-Skript sein, nicht nur ein Skript. Es sollte startund und stopund unterstützen (siehe Debian-Politik )
  • Das Skript kann während des Systemstarts ausgeführt werden (Sie können festlegen, wann).

crontab(und deshalb @reboot).

  • cron führt alle regulären Befehle oder Skripte aus, hier nichts Besonderes.
  • Jeder Benutzer kann ein @rebootSkript hinzufügen (nicht nur root)
  • auf einem Debian-System mit systemd: crons @reboot wird während ausgeführt multi-user.target.
  • Auf einem Debian-System mit SysV (nicht systemd) erwähnt crontab (5): Bitte beachten Sie, dass für @reboot der Zeitpunkt des Starts des Daemons cron (8) ist. Dies ist insbesondere möglich, bevor einige System-Daemons oder andere Einrichtungen gestartet wurden. Dies liegt an der Startreihenfolge der Maschine.
  • Es ist einfach, dasselbe Skript beim Booten und in regelmäßigen Abständen zu planen.

/etc/rc.localwird oft als hässlich oder veraltet angesehen (zumindest von RedHat ), hatte aber dennoch einige nette Features:

  • rc.local führt alle regulären Befehle oder Skripte aus, hier nichts Besonderes.
  • auf einem Debian-System mit SysV (nicht systemd): rc.localwar (fast) der letzte Dienst, der gestartet wurde.
  • aber auf einem Debian-System mit systemd: rc.localwird network.targetstandardmäßig danach ausgeführt (nicht network-online.target!)

Lesen Sie in Bezug auf systemd network.targetund Ausführen von Diensten, nachdem das Netzwerk aktiv ist .network-online.target

Franklin Piat
quelle
In meinem Ununtu 16.04 muss ich /var/run/crond.rebootjedes 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ührt
Albert Català,
@ Albert-Catala Ubuntu einen Fehler melden!
Franklin Piat
12

Erstens ist eine Klarstellung angebracht:

  • init.d ist das Verzeichnis, in dem Skripts zur Dienstesteuerung gespeichert sind, die das Starten und Beenden von Diensten wie httpdoder steuerncron
  • rc.local ist ein Dienst, der das Ausführen von beliebigen Skripten als Teil des Systemstartprozesses ermöglicht

In Bezug darauf, ob es besser ist, Ihr Skript zu verwenden rc.localoder cronauszuführen, vermute ich, dass es eher eine Frage der Ästhetik als der Praktikabilität ist. cronist 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.localauf der anderen Seite würde fällt mehr innerhalb einer Systemkonfiguration Art der Aufgabe, wie rc.localvon 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.localMechanismus und nicht alle cron-Daemons einen @rebootpsuedo-Tag bieten .

Bonuspunkte

Wie bereits erwähnt, init.dist 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 ein SysVSystem 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 .shanstatt 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 so bash /path/to/script.whatever, sollte es für die Ausführung des Skripts keine Rolle spielen.

wraeth
quelle
bashSkripte enden normalerweise nicht mit einer Erweiterung (und sollten dies wohl auch nicht tun )sh .
mikeserv
1
@mikeserv: Während ich zustimme, dass die meisten Bash-Skripte keine Erweiterung haben (und wohl auch nicht haben sollten), sind Dateien mit der Erweiterung ".sh" normalerweise Bash-Skripte - siehe "Was ist eine .sh-Datei?" .
David Cary
@DavidCary - das scheint keine sehr maßgebliche Quelle zu sein.
mikeserv
1
Wikipedia: "Liste der Dateinamenerweiterungen" und Wikipedia: "Shell-Skript" erwähnen auch die überraschend häufig vorkommende ".sh" -Erweiterung mit Verweisen.
David Cary
1
" Bash-Skripte enden in der Regel mit dem Suffix" .shstatt.txt ". Dies bedeutet, dass die shDateinamenerweiterung für Bash-Skripte (oder andere Shell-Skripte) genauer ist als für txtKlartext. Sie können jede Erweiterung verwenden, die Sie zum Kichern bringt. Eine übliche Konvention wäre jedoch, wenn die Verwendung einer Erweiterung shangemessener wäre und häufig verwendet wird. Dies ist jedoch nicht erforderlich, insbesondere für Skripte, die von der ausgeführt werden sollen PATH.
Wraeth
3

Ich schreibe meine Antwort unten;

F1: Was sind die Hauptunterschiede zwischen den beiden?

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).

F2: Welches ist robuster?

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

Frage 3: Gibt es eine bessere von beiden?

Ich glaube nicht (rc.local ist ein bisschen alt und veraltet)

F4: Ist dies die richtige Methode zum Einbetten eines Skripts, das beim Booten ausgeführt werden soll?

Ja. Normalerweise machen Application- / Package-Writer das so.

Shubham
quelle