Auch wenn Upstart seit Ubuntu 15.04 durch systemd abgelöst wurde, wird es doch noch eine ganze Weile durch die LTS-Version 14.04 und vor allem durch RedHat Enterprise Linux 6 sowie dessen Klonen CentOS und Scientific Linux erhalten bleiben.
Leider wurde Upstart von Canonical immer etwas stiefmütterlich behandelt bzw. hat nie so eine mediale Präsenz wie systemd erhalten. Dabei muss sich das Init-System nicht verstecken und bietet viele Funktionen, die auch systemd bietet.
Am Beispiel des Dateisynchronisationprogramms Syncthing zeige ich drei Möglichkeiten dessen Daemon auf unterschiedliche Art zu starten. Syncthing läuft dabei grundsätzlich als Hintergrunddienst mit den Rechten des jeweiligen Benutzers bzw. eines festgelegten Benutzers.
Methode 1 – Beim Systemstart ohne Benutzerlogin
Dabei wird die Init-Datei für Upstart unter /etc/init
abgelegt. Über die Anweisungen setgid
und setuid
wird der Benutzer festgelegt, die Variable „HOME“ legt das Benutzerverzeichnis fest (Übernommen von Keeping Syncthing Running: Upstart:
description "Syncthing P2P sync service"
start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]
setuid „glasen“
setgid „glasen“
env STNORESTART=yes
env HOME=/home/glasen
respawn
exec /usr/bin/syncthing
Wichtig ist hierbei den korrekten Benutzer und das passende Benutzerverzeichnis festzulegen. Der Daemon läuft dabei bis das System heruntergefahren wird. Diese Lösung ist optimal für den Einsatz auf einem Server oder NAS. Bei mir läuft der Daemon auf meinem V-Server mit den Rechten eines normalen Benutzers.
Methode 2 – Starten beim Einloggen eines spezifischen Benutzers in Unity
Die Init-Datei wird hierbei im Verzeichnis ~/.config/upstart
des jeweiligen Benutzers abgelegt. Die Angaben setuid
, setgid
und die Variable HOME
können dabei entfallen. Es werden zusätzlich noch die Upstart-Stanzas „start on“ und „stop on“ abgeändert, damit der Daemon auch tatsächlich beim Einloggen und Ausloggen gestartet bzw. beendet werden:
description "Syncthing P2P sync service"
start on desktop-start
stop on desktop-end
env STNORESTART=yes
respawn
exec /usr/bin/syncthing
Methode 3 – Starten beim Einloggen eines beliebigen Benutzers
Die Datei ist identisch zur Methode zwei, sie wird nur im Verzeichnis „`/usr/share/upstart/sessions„ abgelegt. Sobald sich ein beliebiger Benutzer in Unity einloggt, wird dabei der Daemon gestartet. Diese Methode macht im Zusammenhang mit Syncthingnicht unbedingt viel Sinn, da der Daemon erst konfiguriert werden muss, damit er überhaupt richtig funktioniert (Wie z.B. die zu synchronisierenden Verzeichnisse und Geräte hinzufügen), kann aber bei anderen Diensten nützlich sein, weshalb ich sie hier aufführe.
Schaut man sich das Verzeichnis aber mal genauer an, stellt man fest, dass Ubuntu sehr starken Gebrauch von diesem macht. Das Verzeichnis enthält quasi alles was beim Starten von Unity gestartet werden muss, damit der Desktop funktioniert. Klassisch würde dies alles über einzelnen Session-Skripte laufen, Ubuntu hatte dies über Upstart-Init-Dateien implementiert. Interessanterweise benutzt Unity dieses Verzeichnis auch noch unter Ubuntu 15.10 um einzelne Dienste zu starten, welche es zum Funktionieren benötigt. Aus diesem Grund wird auch unter der neuesten Ubuntu-Version noch das Paket „upstart“ benötigt.
Natürlich gibt es den bei den Methoden 2 und 3 auch den Weg über den Autostart-Ordner und eine desktop-Datei. Ich persönlich finde den Weg über Upstart aber eleganter, da hier auch sehr einfach Abhängigkeiten definieren kann und man auch komplexere Skript in eine Upstart-Datei packen kann. Bei den desktop-Dateien muss man dabei immer den Umweg über ein externes Skript nehmen.