Debian: Wie kann man ein Skript beim Start ausführen, ohne 30 Zeilen Shell-Skript schreiben zu müssen?

20

Ich habe einen Debian-Server und muss beim Start nur ein Skript ausführen.

Ich habe folgendes gelesen: https://www.debian-administration.org/article/28/Making_scripts_run_at_boot_time_with_Debian

Ich habe jetzt: insserv: warning: Skript 'fehlende LSB-Tags und Überschreibungen

so wie es aussieht muss ich jetzt noch hinzufügen:

### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

Es sieht jetzt verrückt aus: wie 30 Zeilen Skript, nur um ein Programm beim Start auszuführen.

Gibt es ein Tool, mit dem dies auf einfache Weise möglich ist?

Grüße

yarek
quelle
Was für ein Skript ist das? Haben Sie versucht, es von /etc/rc.local aus auszuführen? Sie können den Pfad zum Skript in die Datei rc.local einfügen, die beim Booten ausgeführt wird.
Diamant
Ein einfaches Skript, das einen Node-Prozess startet, ein PHP-
Programm
Ich zähle 9 Zeilen, nicht 30. Und es sind Kommentare, kein Shell-Skript (und kein SSH-Skript).
Wurtel
Sie sind LSB-Header (siehe wiki.debian.org/LSBInitScripts ) und ein LSB-Init-Skript-Boilerplate befindet sich nördlich von 70 Zeilen (siehe Dinge wie github.com/fhd/init-script-template/blob/master/template ). Wenn Sie möchten, dass ein einzelner Befehl, der von Hand ausgeführt wird, beim Booten durch den Computer über eine Datei in / etc für Sie verarbeitet wird, scheint dies eine ziemlich aufwändige Zeremonie zu sein!
kristopolous

Antworten:

29

Wenn Ihr Skript "nur ein Skript" ist und keinen Daemon startet, sollten Sie die Verwendung von /etc/rc.local(als Root ausgeführt) oder crontab(als Benutzer Ihrer Wahl ausgeführt) in Betracht ziehen .

Zwei Beispiele:

  • /etc/rc.local

    #!/bin/sh -e
    #(Multiple lines of comments removed.)
    /usr/local/bin/your-script.sh
    exit 0
    
  • crontab(bearbeitet zB über crontab -e)

    #(Multiple lines of comments removed.)
    @reboot /usr/local/bin/your-script.sh
    

Bearbeiten 1: Lesen Sie einfach Ihren Kommentar: Wenn Ihr Skript Daemons startet, die die ganze Zeit ausgeführt werden sollen, rate ich von der Verwendung von rc.localoder ab crontabund schreibe stattdessen ein geeignetes (oder mehrere) init.dSkript (e). Auf diese Weise können Sie / Ihr System die Daemons sauber neu starten / neu laden / starten / stoppen usw.

Bearbeiten 2: Sie nennen es verrückt, aber die LSB tagsbieten einen gewissen Wert: "Durch Dokumentieren der Laufzeitabhängigkeiten für init.d-Skripte wird es möglich, die aktuelle Startreihenfolge zu überprüfen, den Start anhand dieser Abhängigkeiten zu ordnen und Startskripte auszuführen parallel, um den Startvorgang zu beschleunigen. " Weitere Informationen finden Sie im Debian-Wiki .

(Übrigens: Es ist eine Warnung, es liegt also an Ihnen, wie und was Sie damit anfangen sollen.)

gf_
quelle
Ich mag die Crontab-Version, aber ich glaube nicht, dass @reboot auf Debian funktioniert!
Yarek
@yarek: Es funktioniert, wenn ich das selbst benutze (für Skripte, die nur Skripte sind).
gf_
2
es funktioniert, aber ich denke, es ist nur für Root-Benutzer, so müssen Sie tun@reboot root /usr/local/bin/your-script.sh
Froggiz
Übrigens sprach ich über Debian!
Froggiz
Ich bin in der Tat immer noch ziemlich verwirrt: Kann cron beim Neustart des Servers ein Skript ausführen, ohne Sitzungen als root zu öffnen?
Yarek
0

Supervisor ist auch eine Option. Sie werden wieder einige Zeilen schreiben, um Ihre node.js- und PHP-Sachen zu starten, aber sie werden weniger sein.

adamo
quelle
0

Sie können dazu monitd verwenden. Schreiben Sie einfach eine Monit-Definition und es werden Daemons für Sie gestartet. Aber warum verwenden Sie LSB-Skripte nicht richtig? Es ist nicht so schwer, es zu schreiben (Sie schreiben es nur einmal), und es ist der sauberste und wertvollste Weg, dies zu erreichen.

Ondra Sniper Flidr
quelle