Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungC C++ C/C++ ANSI C Linux Linuxsystemprogrammierung Unix fork system exec Prozess Prozesse Dämon Daemon Prozess Linuxsystemprogrammieren fork system exec Prozess Prozesse Daemon Dämon 3. Dämon-Prozesse

3.1. Dämonprozesse - Prozesse aus dem Untergrund           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

Es wurde nun schon des öfteren von Dämonprozessen gesprochen. Manch einer wird noch nicht wissen, was und wofür diese da sind.

Als Dämonen werden unter Linux/Unix Prozesse bezeichnet, die im Hintergrund oder wie es sich für Dämonen gehört, im Untergrund arbeiten. Dämonen kümmern sich um die Systemverwaltung im System. Diesen Prozessen ist kein Terminal (TTY) zugewiesen. Daher bekommen Sie auch bei Aufruf des Kommandos ps nur ein Fragezeichen bei TTY zu sehen.

Beim Start Ihres Systems werden zahlreiche Dämonen gestartet. Hier einige der Bekanntesten ...

crond
Mit dem cron-Dämonen können Sie andere Prozesse zu einer von Ihnen bestimmten Zeiten starten. Starten können Sie diesen Dämon mit dem Kommando crontab. Einfaches Beispiel, sie haben ein Programm geschrieben, das jeden Morgen um 9.00 Uhr Ihr Verzeichnis von Mülldateien befreit. Nennen wir das Programm einfach 'recycle' ...

crontab -u username -e

Der Schalter 'u' steht für den 'username' und der Schalter 'e' für das Editieren eines Cron-Jobs. Geben Sie jetzt in einem Editor folgendes ein ...

0 9 * * * /home/myhome/programme/recycle

... und speichern Sie dies ab. Jetzt wird jeden morgens um 9 Uhr das Programm 'recycle' ausgeführt. Eine Liste aller Cron-Jobs die Aktiv sind, erhalten sie mit ...

crontab -u usernam -l

Ich denke aber, das den meisten lieber das Programm kcron, des KDE-Desktop ist.

inetd
Dies ist ein Dämon der andere Netzwerkdämonen startet. Wird mit inetd.conf gesteuert.

lpd
Der Drucker-Dämon.

syslog
Dämon zum Protokolieren von Systemmeldung (Darauf kommen wir noch in der Praxis zurück).

klogd
Dämon der Kernel-Meldungen protokoliert.

ftp,http,NFS
Verschiedene Netzwerk-Dämonen

3.2. Prozesse beobachten mit syslog - Dämon           zurück Ein Kapitel höher zum Inhaltsverzeichnis

Wollen Sie Ausgaben von Programme abfangen oder verwaltenm, können Sie die Funktion syslog() verwenden. Mit syslog werden die Meldungen von lokalen Systemen und/oder Netzwerken ausgelesen und aufbereitet.

Die Meldung wird dann aus /dev/log gelesen und besteht aus 2 Teilen. Dem eigentlich Text und einer Kombination aus Typ (Facilities) und Priorität (Level).

Folgende syslog-Typen (facilities) können in der Nachricht sein ...

LOG_KERN            Kernel-Nachrichten
LOG_USER            Nachricht von Usern
LOG_MAIL            E-Mail-Subsystem
LOG_DAEMON          Verschienden Dämonen
LOG_SYSLOG          syslog-interne Nachrichten
LOG_LPR             Drucker-Subsystem
LOG_NEW             News-Subsystem
LOG_UUCP            UUCP-Subsystem
LOG_CRON            Cron-Dämon
LOG_AUTHPRIV        Authorisierung
LOG_LOCAL0...7      Reserviert für Eigenbedarf

Die syslog-Priorität (Level) sieht folgendermaßen aus. Die Tabelle geht von oben (höchste Priorität) nach unten (niedrigste Priorität) durch ...

LOG_EMERG     System ist unbrauchbar
LOG_ALERT     Dringed irgendwelche Aktionen einleiten
LOG_CRIT      Kritische Nachrichten
LOG_ERR       Normaler Fehler
LOG_WARNING   Warnung
LOG_NOTICE    Normale, bedeutende Nachricht
LOG_INFO      Normale Nachricht
LOG_DEBUG     Unwichtige Nachricht

Nun werden Sie sehen wie Sie in C aus dem syslogd-Dämon lesen können. Viele Dämonen rufen die Funktion syslog (Konsolenfunktion) auf, um eine Nachricht zu erstellen. Diese Nachricht wird dann an das Unix Socket /dev/log geschickt.

Zuerst müssen Sie also eine Verbindung zum Dämon Syslog aufbauen. Diese erfolgt mit der Funktion ...

#include <syslog.h>

void openlog(char *ident, int option, int facility);

Mit ident legen Sie den Programmnamen fest. Diese Variable dient als Indenfizierer für erzeugte Syslog-Nachrichten. Dies ist üblicherweise der Programmname.

Folgende option und deren Bedeutung können Sie verwenden (es kann auch eine ODER-Verknüpfung für mehrere Optionen verwendet werden) ...

LOG_CONS    Ausgabe erfolgt direkt auf die Konsole, sollte ein
            Fehler mit dem System-Login auftreten.
LOG_NDELAY  Verbindung zum Login-Dämon wird sofort aufgebaut. Nicht wie
            normalerweise, wenn die erste Nachricht geschrieben wurde.
LOG_PERROR  Die Nachricht wird außer an den syslogd - Dämon noch zusätzlich
            an den Fehlerkanal (stderr) geschickt.
LOG_PID     Wird ein Programm mehrfach gestartet, ist es sinnvoll diese Option
            zu verwenden, da jede syslog - Nachricht ein PID enthält.
            Sie können damit genau ermitteln welcher Prozeß diese Nachricht
            geschickt hat. Beispielsweise wenn sie mit fork eine Kindprozeß
            zur Erledigung bestimmter Aufgaben erzeugen.

Die Syslog-Typen (facility) haben Sie bereits am Anfang des Kapitels kennengelernt (LOG_KERN,LOG_USER,LOG_MAIL,LOG_DAEMON......).

Somit kann ein openlog-Aufruf folgendermaßen aus ...

openlog("lpd-daemon", LOG_PID, LOG_LPR);

Hier dient als Kennung 'lpd-daemon'. Es wird außerdem immer die Prozess-ID mitausgegeben (LOG_PID) und als Einrichtung wird das Druckersystem verwendet.

Nach dem Sie den STREAM mit openlog geöffnet haben, könnenSie nun mit der Funktion syslog eine Log-Nachricht erstellen ...

#include <syslog.h>

void syslog(int priortät, char *format, ...);

Als Piorität können Sie eine der acht verfügbaren verwenden, die Sie weiter oben schon kennengelernt haben (LOG_EMERG, LOG_ALERT, LOG_CRIT.....). In format befindet sich die eigentlich Nachricht. Dazu können Sie einen normalen Formatstring verwenden.

Bei Beendigung der Verbindung übernimmt openlog die Beendigung. Wollen Sie aber während des Programmablaufes die facility ändern, müssen sie die Verbindung vorher mit ...

#include <syslog.h>

void closelog(void);

...schließen, um diese mit openlog und mit den neuen facility's wieder zu öffnen. Um Ihnen das ganze jetzt anhand eines Programms zu Demonstrieren erstellen Sie jetzt einen eigenen Syslog-Typen (facility). Öffnen Sie die Datei /etc/syslog.conf mit einem Editor (als root). Darin finden Sie jetzt zum Beispiel folgenden Eintrag ...

# Mail logging
mail.=debug;mail.=info;mail.=notice    -/var/log/mail/info
mail.=warn                             -/var/log/mail/warnings
mail.err                               -/var/log/mail/errors

Was bedeutet nun ...

mail.=debug;mail.=info;mail.=notice

Dies heißt, falls syslog eine Nachricht mit der Priorität LOG_DEBUG, LOG_INFO oder LOG_NOTICE erhält wird diese in die Datei /var/log/mail/info gelesen.

Liest syslog die Nachricht mit der Priorität LOG_WARNING wird dies in /var/log/mail/warnings gelesen. Sie wollen nun einen eigenen Typen (facility) festlegen, der eine Ausgabe auf /dev/tty1 macht. Mit LOG_LOCALx haben Sie ja acht übrig, wovon bei einer Neuinstallation keiner belegt sein sollte. Schreiben Sie einfach ans Ende der Datei /etc/syslog.conf ...

#Testroutine,
local0.=notice                             -/dev/tty1

Nun überwachen Sie das Programm, welches Sie den Typen LOG_LOCAL0 geben. Erkennt syslog die Priorität LOG_NOTICE, gibt das Programm einen Text auf das Terminal /dev/tty1 aus (vorausgesetzt Sie haben dies auch am laufen (STRG+ALT+F1)). Natürlich sollten Sie im Falle einer Nachricht nicht jede Nachricht auf dem Bildschirm ausgeben. Idealer wäre es, in diesem Fall, die Nachricht ebenfalls in eine Log-Datei zu schreiben. Je nach Priorität der Nachricht. Wie Sie die syslog.conf - Datei dementsprechend konfigurieren entnehmen Sie bitte aus der man-Pages zu syslogd. Hier nun das Programm ...

#include <stdio.h>
#include <unistd.h>
#include <syslog.h>

int main(int argc, char **argv)
{
 openlog("test2", LOG_PID | LOG_CONS, LOG_LOCAL0);
 syslog(LOG_NOTICE, "Hallo Welt mit syslog\n");

 closelog();
 return 0;
}

Starten sie den syslog-Dämon neu, damit die Konfiguration in syslog.conf übernommen wird. Dies können Sie am besten durch einen Neustart des Systems erreichen.

Von wo Sie das Programm starten ist eigentlich egal. Wichtig ist nur, dass sie in das Terminal /dev/tty1 schauen und natürlich auch eingeloggt sind. Dort wird nun der Text mit mit dem Programmnamen und der PID ausgeben ...

Datum Uhrzeit test2[12345] Hallo Welt mit syslog

Mit ...

syslog(LOG_NOTICE, "Hallo Welt mit syslog\n");

..aktivieren Sie den syslog-Dämon und er tut seine Pflicht. Dies Programm dient natürlich nur zu Testzwecken, damit Sie sehen wie Sie einzelne Programme überwachen können und Meldungen in eine Logdatei oder auf dem Bildschirm ausgeben können. Anstatt auf /dev/tty1 sollten Sie wegen der Probleme mit der Pufferung eher auf /dev/xconsole die Meldung ausgeben. Mehr dazu unter man xconsole

In Praxis kann das System Loggin auf der Suche nach Fehlern in Programmen sehr helfen. Versuchen Sie mal in einem Umfangreichen Programm eine eigene Login-Routine einzubauen. Sie werden sehen, dass Sie mit einer Ausgabe von Syslog das ganze viel einfacher bewerkstelligen können. Sie können zum Beispiel überwachen wer gerade wann auf ein bestimmtes Programm zugreift ...

 openlog("myprogramm", LOG_PID | LOG_CONS, LOG_LOCAL0);

 if( (strcmp(nam1,login)) == 0)
   syslog(LOG_NOTICE, "King hat sich gerade eingeloggt");
 else if( (strcmp(nam2,login)) == 0)
   syslog(LOG_NOTICE, "Kong hat sich gerade eingeloggt");

Wo Sie das einlesen, hängt immer ab von Ihrer Konfiguration in syslog.conf. Bedenken Sie aber, wenn Sie es auf dem Bildschirm ausgeben wollen, wer das eventuell auch lesen könnte. Linux selber gibt normalerweise Nachrichten auf dem Bildschirm nur mit der allerhöchster Priorität aus.

Natürlich können den syslog-Dämon auch für eigene Dämonen verwenden. Wie Sie eigene Dämonen erstellen, erfahren Sie gleich.

Weiter mit 3.3. Erstellen von eigenen Dämon - Prozessen