27.7 Upstart 

Upstart wurde ursprünglich von und für Ubuntu entwickelt. Mittlerweile ist das Programm fester Bestandteil der aktuellen Ubuntu-Version. Auch andere Distributionen haben Upstart bereits (testweise) integriert. Gedacht ist Upstart als Ersatz bzw. als Erweiterung für init, allerdings ist es noch nicht so weit, dass sich Distributionen wie Slackware von init zugunsten von Upstart 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. Steckt man beispielsweise einen USB-Stick an den Rechner, so löst dies automatisch ein Event aus, das dazu führt, dass der USB-Stick gemountet wird. Die Entwickler haben dabei etwas weiter gedacht und sind zu dem 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.
27.7.1 Jobs 

Upstart bezeichnet die einzelnen Skripte, die beim Eintreffen eines Events ausgeführt werden sollen, als »Jobs«. [Die hier bezeichneten »Jobs« 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 Upstart benutzen, so darf man sich die Jobskripte mehr oder minder selbst schreiben. Es gibt zwar vorgefertigte Beispielskripte, doch die müssen sehr wahrscheinlich recht aufwändig angepasst werden. [Das hängt sehr von der Distribution ab.]
Ein Beispiel
Schaut man sich das /etc/event.d-Verzeichnis unter Ubuntu an, so gwinnt man schnell einen Einblick in den Aufbau dieser Skripte. 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 9.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 27.24 /etc/event.d/rc2
Sobald das System in den zweiten Runlevel wechselt wird dieses Skript ausgeführt (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 – das Job-Skript ist damit abgearbeitet.