Wie führe ich ein Shell-Skript beim Start aus?

13

Ich habe ein Skript zum Starten eines Servers erstellt (meine erste Frage). Jetzt möchte ich, dass es auf dem System-Boot läuft und den definierten Server startet. Was soll ich tun, um dies zu erreichen?

Laut meinen Ergebnissen befindet sich diese Datei am /etc/init.dSpeicherort. Sie wird ausgeführt, wenn das System gestartet wird. Aber ich kann nicht verstehen, wie das erste Argument beim Start sein wird start? Ist das vordefinierte irgendwo zu verwenden , startwie $1? Wenn ich einen Fall haben möchte, der startallalle Server im Skript startet, welche Optionen kann ich dann verwalten?

Mein Skript sieht so aus:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
quelle
Ich weiß, dass dies alt ist, aber die Shell sollte "#! / Bin / sh" sein, nicht "#! / Bin / bash" (zB / usr / lib kann nicht gemountet werden)
Rich Homolka

Antworten:

19

/etc/init.dist das Skriptverzeichnis, in dem die ausführbaren Skripte angezeigt werden. Um jedoch nach dem Start Ihres Systems Skripts in einer bestimmten Reihenfolge auszuführen, müssen Sie dem /etc/rc#.dVerzeichnis Dateien hinzufügen . Einträge, die hier angezeigt werden, teilen Ihrem System mit, in welcher Reihenfolge und auf welcher Ausführungsebene Skripte ausgeführt /etc/init.dwerden sollen. Die Zahl nach dem rc gibt an, mit welchem ​​Runlevel die Maschine gemäß dieser Tabelle läuft:

http://en.wikipedia.org/wiki/Runlevel

Also, wenn Sie haben:

/etc/init.d/importantscript

Dann brauchen Sie die (leeren) Dateien:

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

Das S bedeutet Start und das K bedeutet Kill. Wenn Ihr Computer startet, wird das System sagen: "Ah, ich arbeite auf RunLevel 3, gehen wir zu rc3.d, um zu sehen, welche Skripte in '/etc/init.d' ausgeführt werden müssen und in welcher Reihenfolge." In diesem Fall sortiert das System nach 'S' und dann nach 'S' und führt '/etc/init.d/importantscript start' aus. Die 20 dient nur zu Bestellzwecken ... Ihr Skript wird hinter "S19" und vor "S21" ausgeführt. Sie können diese Dateien einfach wie folgt erstellen:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Hier ist auch eine schöne Zusammenfassung: http://www.linux.com/news/enterprise/systems-management/8116-und-einführung-in-services-runlevel-und-rcd-scripts

Aronchick
quelle
Ist es nicht üblicher, "ln -s /etc/init.d/script" auf rcX.d / * zu setzen?
Ozma
8

Sie müssen --- und sollten --- keine Dateien erstellen /etc/rc.d/rcN.d/. Sie sollten stattdessen einen Kommentar in Ihr Init-Skript einfügen

# chkconfig NNN A B

wo NNNist die Menge der Runlevel , in denen Sie das Skript aktiv werden sollen (zB 345wenn es in dem Runlevels aktiv ist 3, 4und 5) und Aund Bsind die Start- und Stopp - Prioritäten. Dann werden chkconfig --add foo(unter der Annahme, dass Ihr Skript benannt ist foo) die Dateien /etc/rc.d/rcN.d/mit den entsprechenden Namen erstellt.

Sie können dann mit service foo barder schicken barNachricht an das Skript (zB start, stop, was auch immer - das ist , wo Ihr $1herkommt).

Peter
quelle
0

$ 1 ist das Befehlszeilenargument, das an Ihr Skript übergeben wird. Es kann gestartet, gestoppt oder neu gestartet werden. Ich erinnere mich nicht, dass ich in openSUSE die Option hatte, andere Argumente an das Skript zu übergeben, wenn ich das Runlevel-Editor-Ding verwendete. Daher denke ich, dass dies wahrscheinlich die einzigen sind, die Sie verwenden sollten.

Ich benutze CentOS nicht selbst, aber es scheint, dass das Programm, um zu steuern, was auf welchem ​​Runlevel gestartet wird, ntsysv ist .

Neal
quelle