Wie führe ich ein Shellskript beim Start aus?

59759
vijay.shad

Ich habe ein Skript erstellt, um einen Server zu starten (meine erste Frage). Jetzt möchte ich, dass es auf dem Systemstart läuft und den definierten Server startet. Was soll ich tun, um das zu schaffen?

Meine Ergebnisse zeigen an, dass sich diese Datei im /etc/init.dSpeicherort befindet. Sie wird ausgeführt, wenn das System startet. 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 verwalten?

Mein Skript ist so:

#!/bin/bash  case "$1" in start) start ;; stop) stop ;;  restart) $0 stop $0 start ;; *) echo "usage: $0 (start|stop|restart)" ;; esac 
13
I know this is old... but the shell should be '#!/bin/sh' not '#!/bin/bash' /bin/sh is more likely to work in the case of a machine that has issues during startup (e.g. /usr/lib not being able to be mounted) Rich Homolka vor 11 Jahren 0

3 Antworten auf die Frage

18
aronchick

/etc/init.dist das Skriptverzeichnis, in dem die ausführbaren Skripts angezeigt werden. Um Skripts in einer bestimmten Reihenfolge nach dem Systemstart auszuführen, müssen Sie dem /etc/rc#.dVerzeichnis jedoch Dateien hinzufügen . Einträge, die hier angezeigt werden, teilen Ihrem System mit, in welcher Reihenfolge und auf welcher Runlevel Scripts ausgeführt /etc/init.dwerden sollen. Die Zahl nach dem Rc gibt an, auf welchem ​​Run-Level die Maschine ausgeführt wird, gemäß der folgenden Tabelle:

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

Wenn Sie also

/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 töten. Wenn Ihr Computer startet, sagt das System "Ah, ich arbeite auf RunLevel 3. Lassen Sie uns zu rc3.d wechseln, um zu sehen, welche Skripte in '/etc/init.d' in welcher Reihenfolge ausgeführt werden müssen." 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 läuft hinter 'S19' und vor 'S21'. Sie können diese Dateien einfach erstellen, indem Sie Folgendes tun:

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

Hier ist auch eine schöne Zusammenfassung: http://www.linux.com/news/enterprise/systems-management/8116-an-inbetriebnahme-nach-services-runlevels-und-rcd-scripts

Ist es nicht üblicher, "ln -s /etc/init.d/script" in rcX.d / * umzuwandeln? ozma vor 7 Jahren 0
8
Peter

Sie müssen nicht --- 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 Prioritäten stoppen. Dann chkconfig --add foo(sofern Ihr Skript einen Namen hat foo) werden die Dateien /etc/rc.d/rcN.d/mit den entsprechenden Namen erstellt.

Sie können dann mit service foo barden schicken barNachricht an das Skript (zB start, stopunabhängig - das ist, wo Ihr $1kommt).

0
Neal

Das $ 1 ist das Befehlszeilenargument, das an Ihr Skript übergeben wird. Es handelt sich um Start, Stopp oder Neustart. In openSUSE kann ich mich nicht erinnern, eine Option zum Übergeben anderer Argumente in das Skript zu haben, wenn der Runlevel-Editor verwendet wird. Ich denke, dass dies wahrscheinlich die einzigen sind, die Sie verwenden sollten.

Ich benutze CentOS nicht selbst, aber es scheint, dass das Programm, mit dem gesteuert wird, was auf dem Runlevel gestartet wird, Ntsysv ist .