System-V

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Prinzip des rc-Skriptes

Hier ein vereinfachtes rc-Skript dieses stoppt im akutellen Runlevel die Skripte wenn sie nicht im vorhergehenden Runlevel schon gestoppt wurden und es werden nur Skripte gestartet die nicht im vorhergehenden Runlevel schon gestartet worden sind.

root@zero:~# cat /etc/init.d/rc 
#!/bin/bash
PREVLEVEL=$1
RUNLEVEL=$2
for KILL in /etc/rc$RUNLEVEL.d/K*
 do
  BASE=$(basename $KILL | cut -c 4-)
    if ! test -f /etc/rc$PREVLEVEL.d/K??$BASE
  then 
   test -f $KILL && $KILL stop
  fi
 done
for START in /etc/rc$RUNLEVEL.d/S*
 do
  BASE=$(basename $START | cut -c 4-)
    if ! test -f /etc/rc$PREVLEVEL.d/S??$BASE
  then 
  test -f $START && $START start
  fi
 done


Init Skripte

Die initskripte der Programme sind alle in /etc/init.d Symbolische Links werden von /etc/init.d/ nach /etc/rcX.d/ gesetzt. Beispiel Apache2

root@zero:/# ls  -l /etc/rc?.d/???apache2 | cut -f 8- -d " "
/etc/rc0.d/K09apache2 -> ../init.d/apache2
/etc/rc1.d/K09apache2 -> ../init.d/apache2
/etc/rc2.d/S91apache2 -> ../init.d/apache2
/etc/rc3.d/S91apache2 -> ../init.d/apache2
/etc/rc4.d/S91apache2 -> ../init.d/apache2
/etc/rc5.d/S91apache2 -> ../init.d/apache2
/etc/rc6.d/K09apache2 -> ../init.d/apache2

Um kompfortabel zu Verlinken kann man die Programm

  • chkconfig
  • insserve

Eigenes Startskript

Dieses Skript öffnet beim starten einen Port und man kann über das Netzwerk mit netcat etwas in die Datei listener schreiben. Diese Skript wird wie alle Start-Stop-Skripte "/etc/init.d/legean start|stop" aufgerufen.

root@zero:/etc/init.d# cat /etc/init.d/legean 
#!/bin/bash
### BEGIN INIT INFO
# Provides:          legean
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop unser legean skript
### END INIT INFO
 PORT=4711
case $1 in
  start)
   echo start listener
   netcat -lp $PORT >> /tmp/listener & 
  ;;
  stop)
   fuser -kn tcp $PORT
   echo stop listener
  ;; 
  esac



update-rc.d

Nach dem Laden des Linux-Kernels wird als erstes Programm überhaupt das Programm init gestartet. Dieses Programm startet alle weiteren Programme; welche das sind, wird über die Skripte im Verzeichnis /etc/init.d/ aus dem Paket upstart bestimmt. Je nach gewünschtem Runlevel des Systems zeigen Links aus den Verzeichnissen /etc/rcN.d/ (N ist die Nummer des aktuellen Runlevels, normalerweise 2) auf die Skripte im Verzeichnis /etc/init.d/, so ist beispielsweise /etc/rc2.d/S20exim4 ein Link auf das Startskript für Exim (/etc/init.d/exim4). Den aktuellen Runlevel des Systems zeigt der Befehl runlevel an. Das Anlegen und Löschen dieser Links wird bei der Installation der jeweiligen Dienste automatisch vorgenommen. Ein installierter Dienst wird auf einem Debian System immer auch gestartet. Natürlich können Links von Hand hinzugefügt oder entfernt werden, aber auch für diese Arbeiten am System stellt Ubuntu Werkzeuge zur Verfügung. Eines davon ist update-rc.d

Grundsätzlich ist natürlich immer der Name des Pakets anzugeben, dessen Init-Skripte angepasst werden sollen. Bei Verwendung der Option remove werden alle Links auf das entsprechende Skript entfernt. Hierbei prüft update-rc.d, ob das Skript bereits entfernt wurde. Ist dies nicht der Fall, so bricht update-rc.d ab. Mit der Option -f kann erzwungen werden, dass die Links auch bei Vorhandensein eines Skriptes gelöscht werden.

Mit den Optionen start, stop bzw. defaults werden die notwendigen Links angelegt, gelöscht bzw. wiederhergestellt. Werden zusätzlich einer oder mehrere Runlevel angegeben, so können die Links entsprechend den Wünschen des Systemadministrators angepasst werden.

Leider werden bei einer Aktualisierung eines Paketes alle Links auf die Skripte wieder hergestellt. Dies bedeutet auch, dass mittels update-rc.d deaktivierte Dienste nach einem Update der Software wieder aktiviert werden.

  • Anlegen der Links
root@cardassia:/etc/init.d# update-rc.d  legean defaults
Adding system startup for /etc/init.d/legean ...
  /etc/rc0.d/K20legean -> ../init.d/legean
  /etc/rc1.d/K20legean -> ../init.d/legean
  /etc/rc6.d/K20legean -> ../init.d/legean
  /etc/rc2.d/S20legean -> ../init.d/legean
  /etc/rc3.d/S20legean -> ../init.d/legean
  /etc/rc4.d/S20legean -> ../init.d/legean
  /etc/rc5.d/S20legean -> ../init.d/legean
  • Löschen der Links
root@cardassia:/etc/init.d# update-rc.d  -f legean remove
Removing any system startup links for /etc/init.d/legean ...
  /etc/rc0.d/K20legean
  /etc/rc1.d/K20legean
  /etc/rc2.d/S20legean
  /etc/rc3.d/S20legean
  /etc/rc4.d/S20legean
  /etc/rc5.d/S20legean
  /etc/rc6.d/K20legean

Lege den Link S89legean im runlevel 2 an

root@cardassia:/etc/init.d# update-rc.d  -n legean start 89 2 .
Adding system startup for /etc/init.d/legean ...
  /etc/rc2.d/S89legean -> ../init.d/legean

Selbsterklärend ;-)

root@cardassia:/etc/init.d# update-rc.d  -n legean start 99  2 3 4 5 . stop  01 S 1 6  .
Adding system startup for /etc/init.d/legean ...
  /etc/rc1.d/K01legean -> ../init.d/legean
  /etc/rc6.d/K01legean -> ../init.d/legean
  /etc/rcS.d/K01legean -> ../init.d/legean
  /etc/rc2.d/S99legean -> ../init.d/legean
  /etc/rc3.d/S99legean -> ../init.d/legean
  /etc/rc4.d/S99legean -> ../init.d/legean
  /etc/rc5.d/S99legean -> ../init.d/legean