Woher weiß Linux, welche Funktion im Verzeichnis rcX.d ausgewählt werden soll?

Woher weiß Linux, welche Funktion im Verzeichnis rcX.d ausgewählt werden soll?

Ich habe beispielsweise folgendes Skript:

...
start(){
  echo "Starting..."   
  su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"       
  su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"
  touch /var/lock/subsys/dbora 
}

stop(){
  echo "Stopping..."
  su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"
  su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
  rm -f /var/lock/subsys/dbora
}

restart(){
  stop
  start
}

usage(){
  echo "usage: $0 {start|stop|restart}"
}
...

Wenn ich dieses Skript in das Verzeichnis /etc/init.d lege und anschließend in rc3.d einen Link mit einem Dateinamen erstelle, der mit S(start) beginnt, woher weiß Linux dann, dass die Funktion verwendet werden muss start()?

Antwort1

Wenn ich dieses Skript in das Verzeichnis lege und anschließend einen Link mit einem Dateinamen /etc/init.derstelle, der mit (start) beginnt, woher weiß Linux dann, dass die Funktion verwendet werden muss ?rc3.dSstart()

Ich glaube nicht. Die Funktion ist intern in Ihrem Skript und das Skript muss sie selbst aufrufen.

Das andere Gerüst, das dieses Init-Skript umgibt, wird mit einem Argument aufgerufen, das angibt, was zu tun ist, start, stop, restartoder so etwas. Die Namen der Links ( K*und S*) geben an, in welcher Reihenfolge das Skript ausgeführt werden soll und ob sie gestartet oder gestoppt werden sollen. Natürlich macht systemd die Dinge ein wenig anders, aber wenn ich es richtig verstehe, kann es solche Init-Skripte trotzdem unterstützen und muss ihnen daher beim Ausführen das richtige Argument übergeben.

Dann sehen Sie in den Init-Skripten Dinge wie diese:

do_start() {
    something here...
}
do_stop() {
    something else here...
}

case $1 in
    start)
        do_start;;
    stop)
        do_stop;;
    restart)
        do_stop;
        do_start;;
    *)
        usage;;
esac

Das caseunten stehende prüft, was das erste Argument ist, und arbeitet auf dieser Grundlage; das ist der Teil, der in Ihrem Snippet fehlt.

Wenn Sie ein neues Init-Skript schreiben, sollten Sie stattdessen eine Implementierung als systemd-Dienst in Betracht ziehen.

Antwort2

Das tut es (Linux) nicht. Linux ist ein Kernel. Das Gnu/Linux-Betriebssystem weiß es.

Insbesondere der initProzess weiß Bescheid. initSkripte müssen start, stop, haben restart. Diese Methoden haben vordefinierte Bedeutungen und werden zum richtigen Zeitpunkt aufgerufen. Diese Methoden sind die Schnittstelle zu Ihrem Skript, Sie müssen sie implementieren.

Antwort3

Wegen des „S“, mit dem Sie den Link begonnen haben. Wenn ein Link mit „K“ (von „kill“) beginnt, wird die Stoppfunktion ausgeführt.

verwandte Informationen