25.7 Upstart
Upstart wurde ursprünglich von und für Ubuntu entwickelt. Momentan ist es fester Bestandteil der aktuellen Ubuntu-Version. Außerdem wurde es in die Testing-Version von Debian aufgenommen. Gedacht ist Upstart als ein Ersatz bzw. eine Erweiterung für das oben besprochene init, allerdings ist es noch längst nicht so weit, dass sich Distributionen wie Slackware von init trennen würden.
Was ist aber nun neu an Upstart? Das Besondere an Upstart ist, dass der Start von Programmen (und damit auch von System- und Netzwerkdiensten) anhand von Events geschieht. Beispielsweise steckt man einen USB-Stick an den Rechner und dies löst automatisch ein Event aus, das dazu führt, dass Ihr USB-Stick gemountet wird. Die Entwickler haben dabei etwas weiter gedacht und sind zum Schluss gekommen, dass Upstart damit auch die Möglichkeit hat, den Cron-Dienst zu ersetzen (speziell durch die geplanten »sheduled tasks«). Außerdem kann Upstart Dienste neu starten, falls sie abgestürzt sind.
25.7.1 Jobs
Upstart bezeichnet die einzelnen Skripte, die beim Eintreffen eines Events ausgeführt werden sollen, als »Jobs«. <Diese sind nicht mit den Jobs, die man aus der Shell kennt, zu verwechseln.> Die dazu notwendigen Skripte werden im Verzeichnis /etc/event.d abgelegt.
Benutzt man nicht gerade eine der wenigen Distributionen, die bereits jetzt Upstart benutzen, so darf man sich die Job-SKripte mehr oder minder selbst schreiben. Es gibt zwar vorgefertigte Beispielskripte, doch die müssen sehr wahrscheinlich recht umfangreich angepasst werden. <Das hängt sehr von der Distribution ab.>
Ein Beispiel
Schaut man sich das /etc/event.d-Verzeichnis unter Ubuntu an, so wird man schnell einen Einblick in den Aufbau dieser Skripte bekommen. Nimmt man beispielsweise ein typisches Runlevel-Skript, so wird man feststellen, dass das Job-Skript kaum mehr tut, als das entsprechende rc-Skript aufzurufen.
Als Beispiel soll hier das Job-Skript für den zweiten Runlevel von Ubuntu 7.04 dienen:
# rc2 – runlevel 2 compatibility # # This task runs the old sysv-rc runlevel 2 ("multi-user") scripts. It # is usually started by the telinit compatibility wrapper. start on runlevel 2 stop on runlevel [!2] console output script set $(runlevel --set 2 || true) if [ "$1" != "unknown" ]; then PREVLEVEL=$1 RUNLEVEL=$2 export PREVLEVEL RUNLEVEL fi exec /etc/init.d/rc 2 end script
Listing 25.24 /etc/event.d/rc2
Dieses Skript wird gestartet, wenn das System in den zweiten Runlevel wechselt (start on runlevel 2). Sobald dieser Runlevel verlassen wird, wird das jeweilige Skript so gestartet, dass alle gestarteten Tasks beendet werden (stop on runlevel [!2]).
Die Ausgabe des Skripts läuft über /dev/console (console output).
Mit den Befehlen script und end script wird das eigentliche Skript begrenzt. Die zwischen diesen Befehlen enthaltenen Befehle stellen also die eigentlichen auszuführenden Befehle des Jobs dar.
Danach wird der Runlevel gewechselt (und zudem der alte Runlevel über PREVLEVEL neu gesetzt). Sie erkennen sicherlich die Ähnlichkeit zur Shellskriptprogrammierung.
Zuletzt wird der exec-Befehl ausgeführt. Er ruft das /etc/init.d/rc-Skript mit dem Parameter 2 (der den zweiten Runlevel angibt) auf, und das Job-Skript ist abgearbeitet.