Daemons

Aus wiki.archlinux.de
Version vom 5. Dezember 2012, 06:25 Uhr von Dirk (Diskussion | Beiträge) (manuelles Starten: hc fix)

Wechseln zu: Navigation, Suche

Update.png Dieser Artikel behandelt ein Programm oder ein Vorgehen, das durch systemd Sprache en.png überholt wurde.


Unter einem Daemon (manchmal auch Dämon oder Demon) versteht man unter Linux einen Prozess, der normaler Weise im Hintergrund läuft, und mit dem nicht direkt interagiert wird. Ein Daemon stellt Dienste zur Verfügung, mit denen über Systemnachrichten (Signale), Pipes oder Sockets kommuniziert wird.

Daemon-Programme laufen standardmäßig nicht so, wie man sie aufgerufen hat. Der Daemon-Aufruf ist üblicher Weise nur ein Startscript, dass den eigentlichen Daemon-Prozess startet. Der Daemon-Prozess wird dann ein zum init-Prozess in Abhängigkeit stehender Kindprozess, und hängt somit nicht mehr von einer Shell oder einem anderen Programm ab, dies wird „forken“ genannt. Daemon-Prozesse sind demnach so genannte „Forks“.

Mit dem Daemon selbst wird über Systemaufrufe kommuniziert. Verwaltet wird der Daemon mittels des Startscripts.

Einige Daemons sind für den Start des Systems unerlässlich. Wenn zum Beispiel der Systemlogfile-Daemon nicht gestartet wird, werden keine Logfiles geschrieben, was die Fehleranalyse sehr erschwert bzw. ohne Netzwerk-Daemon gibt es kein Netzwerk.

Daemon-Programme sind häufig schon am Namen zu erkennen. Üblicher Weise wird dem entsprechenden Daemon-Programm ein d nachgestellt. Zum Beispiel heißt der Daemon, der für Cron zuständig ist crond, der NTP-Daemon ntpd und der Druckerdienst CUPS heißt cupsd.

Benutzung

Wann Daemons gestartet oder gestoppt werden, hängt gemeinhin mit den Runlevels zusammen. Ob ein Daemon beim Systemstart überhaupt gestartet werden soll, legt man in der Datei /etc/rc.conf fest. Dort gibt es einen Abschnitt zur Konfiguration der Daemons. Alternativ kann man Daemons mittels des jeweiligen Scripts in /etc/rc.d – oder komfortabler über das Programm rc.d – manuell starten und stoppen.

automatischer Start

Im Beispiel werden verschiedene Daemons gestartet. Der Daemon syslog-ng wird dabei im Hintergrund gestartet, genau wie alle weiteren Daemons, die mit einem vorangestellten @ versehen sind, ebenfalls im Hintergrund gestartet werden. „Im Hintergrund“ heißt in diesem Fall, dass der Bootprozess nicht so lange angehalten wird, bis durch das Startscript der Fork erstellt wurde, sondern das Startscript im Hintergrund ausgeführt wird, und der Prozess weiter läuft. Dies spart Wartezeit beim Booten ein.

Daemons, die im Array mit einem ! versehen sind, starten nicht. Im Beispiel werden der HTTP-Daemon (httpd) und der MySQL-Daemon (mysqld) nicht gestartet. Sollte ein anderer Daemon sie allerdings explizit anfordern, werden sie dennoch gestartet.

Da einige Daemons auf Funktionen von anderen Daemons zugreifen, geht das Verschieben in den Hintergrund nicht bei allen Daemons. Im Beispiel sind network, netfs, und fam ohne Prefix eingetragen. Das heißt, dass bei diesen Daemons gewartet wird, bis sie „fertig“ sind, da sie teilweise aufeinander aufbauen.

# -----------------------------------------------------------------------
# DAEMONS
# -----------------------------------------------------------------------
#
# Daemons to start at boot-up (in this order)
#   - prefix a daemon with a ! to disable it
#   - prefix a daemon with a @ to start it up in the background
#
DAEMONS=(@syslog-ng network netfs @crond @acpid fam !httpd !mysqld @cupsd)

In diesem Zusammenhang ist auch die Reihenfolge wichtig, in der Daemons in das DAEMONS-Array eingetragen werden. Wenn ein Daemon von einem anderen Daemon anhängt, muss er nach dem Daemon eingetragen werden, von dem er abhängt. Im Beispiel hängt der Daemon für das Mounten von Netzwerkfreigaben (netfs) vom Daemon für das aktivieren und Verwalten von Netzwerkschnittstellen (network) ab.

Wenn netfs nun vor network gestartet werden würde, würde es zu Fehlermeldungen bezüglich des Netzwerkes kommen, und die Netzwerkfreigaben nicht gemountet werden, da das Netzwerk bisher noch nicht gestartet wurde. Genau so würde es sich verhalten, wenn network im Hintergrund gestartet werden würde, da netfs schon gestartet werden würde, während network noch lädt.

Generell gilt: Wenn von einem Daemon keine anderen Daemons abhängen, ist es egal, an welcher Stelle der Daemon in das Array eingetragen wird, und ob der Daemon im Hintergrund gestartet wird, oder nicht. Ebenfalls egal im Bezug auf andere Daemons ist es, ob der Daemon überhaupt eingetragen wird. Funktionen, die von einem nicht gestarteten Daemon bereitgestellt werden würden, sind dann natürlich nicht verfügbar.

Alle aktuell gestarteten Daemons sind zudem als Dateien in dem Verzeichnis /var/run/daemons vermerkt.

manuelles Starten

Für die Verwaltung von Daemons benötigt man standardmäßig root-Rechte. Um einen Daemon zu verwalten, stellt dieser ein Startscript in „/etc/rc.d“ bereit. Über diese Scripts können Daemons gestartet, gestoppt, neu gestartet (restart) oder anderweitig administriert werden. Auch, wenn die Funktionen von Daemon zu Daemon unterschiedlich sein können, so sind zumindest immer „start“ und „stop“ verfügbar. Viele Daemons bieten auch noch „restart“ an, was einem „stop“ gefolgt von einem „start“ entspricht.

rc.d start mysqld
:: Starting MySQL                                     [DONE]

Hier wird manuell der MySQL-Daemon gestartet. Diese Statusmeldung ist Teil des Startscriptes. Zu sehen sind diese Statusmeldungen unter anderem auch beim Systemstart und geben Aufschluss darüber, ob ein Daemon gestartet wurde („Starting …“), gestoppt wurde („Stopping …“) und ob dies erfolgreich war („DONE“), oder nicht („FAIL“).

Zum stoppen des Daemons wird einfach statt start der Parameter stop verwendet.

weitere Parameter

Einige Daemons bieten neben den drei gängigen Parametern „start“, „stop“ und „restart“ noch weitere Parameter an. Der HTTP-Daemon verfügt noch über den Parameter „status“, der anzeigt, in welchem Zustand sich der Daemon befindet.

rc.d status httpd
:: Checking httpd status                           [STOPPED]
rc.d start httpd
:: Starting httpd daemon                              [DONE]
rc.d status httpd
:: Checking httpd status                           [STARTED]

Es wird zuerst geprüft, in welchem Status sich der HTTP-Daemon befindet. Dies gibt die Meldung „STOPPED“ zurück, das besagt, dass der Daemon nicht läuft. Dann wird der Daemon manuell gestartet, was ohne Fehlermeldung funktionierte. Ein erneutes Status-Erfragen zeigt, dass der Daemon nun in Betrieb ist („STARTED“).

Fehleranalyse

In der Zeit, in der ein Daemon den Zustand wechselt, wird die Meldung „BUSY“ angezeigt, die sich in den jeweiligen Status wandelt („DONE“ oder „FAIL“), wenn der Vorgang abgeschlossen ist.

rc.d stop network
:: Stopping Network                                   [BUSY]
SIOCDELRT: No such process
SIOCDELRT: No such process                            [FAIL]

In diesem Fall wurde versucht, einen bereits nicht laufenden Netzwerk-Daemon anzuhalten, was natürlich fehlschlägt. Hier gibt es vom Netzwerk-Subsystem zusätzlich noch eine Fehlermeldung zurück. Manche Daemons fangen ein solches Vorgehen (doppeltes Starten/Beenden) im Startscript schon ab, der Netzwerk-Daemon allerdings nur beim doppelten Starten.

rc.d start network
Network is already running.  Try 'network restart'

Man kann sich nicht immer darauf verlassen, dass sich alle Daemons beim Starten/Stoppen gleich verhalten, auch nicht, dass es immer Fehlermeldungen gibt. Sollte ein Daemon nicht funktionieren, ein manueller (re)start aber keine Fehlermeldung auswerfen, so ist weitere Recherche anzuraten. Beispielsweise indem man überprüft, ob der Prozess (meist identisch mit dem Startscript-Dateinamen) läuft, oder ob Logfiles geschrieben wurden.

rc.d

Das Programm rc.d bietet unabhängig des Daemons die Möglichkeit, sich den Status anzeigen zu lassen. Beispielsweise ein mal die komplette Liste, dann ein mal nur gestartete Daemons, und ein mal Informationen über einen genau benannten Daemon

rc.d list
[STARTED][AUTO] alsa
[STARTED][AUTO] atd
[STOPPED][    ] avahi-daemon
[STOPPED][    ] avahi-dnsconfd
[STARTED][    ] bluetooth
[STARTED][AUTO] crond
[…]
rc.d list --started
[STARTED][AUTO] alsa
[STARTED][AUTO] atd
[STARTED][AUTO] crond
[STARTED][AUTO] cupsd
[STARTED][AUTO] network
[…]
rc.d list postfix
[STARTED][AUTO] postfix

Mittels rc.d help lassen sich zudem weitere Möglichkeiten von rc.d anzeigen.

Siehe auch