ein Kapitel zurück                                           ein Kapitel weiter

In den beiden Kapiteln zuvor dürfte sich die Frage gestellt haben, wie man wohl eigene Dämonen erstellen kann.

Wenn sie mal in der Konsole....

pstree | less  

....eingeben, wird Ihnen auffallen, das alle Dämonprozesse als Elternprozeß den init-Prozeß haben (wie sie eigentlich schon wissen sollten). Und sie wiesen auch wenn sich der Elternprozeß vor dem Kindprozeß beendet, haben wir ein Waisenkind, dessen sich der Vater aller Prozesse init annimmt.

Nun sehen sie sich nochmals die Prozesse mit pstree | less an. Sie sehen das alle Prozesse einen Anführer haben, einen Dämonprozeß. Wie können wir es nun bewerkstelligen das der verwaiste Kindprozeß, dessen sich init angenommen hat, zum Häuptiling, genauer Sessionführer wird?

Ein Aufruf der man-Page (deutsch)......

man 2 setsid  

...gibt uns darüber Auskunft. Diese Funktion erzeugt als eine neue Sitzung wenn der aufrufenden Prozeß, kein Prozeßgruppenführer ist. Somit wird der Aufrufende Prozeß der einzige Prozeß in der neuen Prozeßgruppe und in dieser Sitzung. Hier der Syntax für setsid........

#include <stdio.h>

pid_t setsid(void); 

Mehr dazu entnehmen sie bitte der aus angesprochenen man-Pages. Zum Schluss wecheseln wir noch mal ins Root-Wurzelverzeichnis und setzen die Dateikreierungsmaske auf 0.

Weitere Vorgänge sind im Code dokumentiert......

/*Download:mydaemon.c*/
#include <stdio.h> #include <unistd.h> #include <syslog.h> #include <sys/types.h> #define CHILD 0 #define ERROR -1 void start_daemon(char *log_name, int facility) { int i; pid_t pid; /*Elternprozeß beenden, somit haben wir einen Waisen dessen sie jetzt vorerst init annimmt*/ if((pid = fork()) != CHILD) exit(0); /*Unser Kindprozess wird zum Session-Führer. Mißlingt dies, kann der Fehler daran liegen das der Prozeß bereits Sessionführer ist */ if(setsid() == ERROR) { fprintf(stderr, "%s kann nicht Session-Führer werden!\n",log_name); exit(0); } /* Gründe für das Root-Wurzelverzeichnis: +core-Datei wird im aktuellen Arbeitsverzeichnis hinterlegt +Damit bei Beendigung mit umount das Dateisystem sicher abgehängt werde kann */ chdir("/"); /*Damit wir nicht die Bitmaske vom Elternprozeß erben bzw. diese bleiben, stellen wir diese auf 0*/ umask(0); /*Wir schließen alle geöffneten Filedeskriptoren....*/ for(i=sysconf(_SC_OPEN_MAX); i>0; i--) close(i); /*Da unser Dämonprozeß selbst kein Terminal für die Ausgabe hat....*/ openlog(log_name, LOG_PID, facility); } int main(int argc, char **argv) { start_daemon("meinDaemon", LOG_USER); while(1); /*Enlossschleifen: Hier sollte nun der Code für den Daemon stehen, was immer er auch tun soll. Bei Fehlermeldungen Beispiesweise: if(dies_ist_Passiert) syslog(LOG_WARNING, "dies_ist_Passiert"); else if(das_ist_Passiert) syslog(LOG_INFO, "das_ist_Passiert");*/ return 0; }

Starten sie nun dieses Programm und geben sie im Terminal....

ps xj  

...ein und sie erkennen unseren Dämonprozeß am Fragezeichen bei TTY und am Elternprozeß PPID der hier 1 (init) ist. Wir habe in diesem Fall einfach einen Dämonprozeß gestartet, der nichts tut. Fehlermeldungen oder sonstige Nachrichten die uns der Dämonprozeß schickt müssen sie ebenso selbst mit der Datei syslog.conf abgleichen (siehe Kapitel zuvor). Wir haben hier zwar als Typen LOG_USER verwendet aber sollten sie schon selbst darauf achten wo die Nachricht dafür geschrieben wird (/dev/log).

Vor kurzem bekam ich eine Mail, in der jemand die Frage stellte, ob ein Dämon ähnlich wie ein Trojaner funktioniert und wie es mit der Sicherheit dabei aussieht? Im Prinzip kann man sich den Dämon als einen Trojaner vorstellen, da es sich dabei ja auch um Prozesse im Hintergrund handelt. Aber Sicherheitsprobleme dürften sich da nicht finden. Denn für einen Dämon benötigt man erst mal root-Rechte. Selbst wenn man diese theoretisch hat gibt es noch einig Dinge zu beachten. Dazu finden sie Sicherlich auf anderen Webseiten etwas.

Ein weiterer Hinweis zu unserem Programmbeispiel oben. Da ein Dämon kein Terminal zur Verfügung stehen hat, sollten einen Signalhandler einrichten der folgende Signale IGNORIEREN soll....

SIGHUP,SIGINT, SIGWINCH  

Wie sie Signalhandler einrichten können steht im Kapitel "Signale".

cron-Jobs == Dämonprozeß? Viele von euch werden sich jetzt sicherlich fragen, wie sie einen Dämonprozeß dauerhaft einrichten können?

  • Entweder sie schreiben ein Skript für Ihren Dämon wie sie diese in /etc/rc.d/init.d/ oder /etc/init.d/ finden.

  • Oder sie verwenden cron-Jobs. crond ist ebenfalls ein Dämon, mit dem sie Programme zu einer bestimmten Zeit und Datum ausführen können.

Wir wollen uns die cron-Jobs ansehen. Die Programme oder Skripte die vom cron-Job aufgerufen werden, laufen wiederum als Dämon (egal ob sie sie als Dämon geschrieben haben oder nicht). Der cron - Dämon wird bereits zu Systemstart mit Hilfe eines Skriptes gestartet.

Was für Programme sie verwenden bleibt Ihnen überlassen. Häufig verwendet werden dafür Perl-Skripts, Shell-Skripts, C-Programme oder CGI-Programme.

Sie finden die Konfiugrations-Files im Verzeichnis /etc Die Zentrale Datei dazu ist /etc/crontab. Mit diesem Befehl können sie eigene cron-Jobs komfortabel erstellen.

Im Internet finden sie Tausende Seiten die Dokumentieren wie sie einen cron-Job einrichten können. Wem das Erichten von cron-Jobs in der Text-Konsole zu lau ist, der kann sich ja für KDE kcron oder für alle Vcron ansehen.

Zugegeben, man könnte zu diesem Thema noch mehr schreiben, aber sie wissen jetzt zumindest, wie sie Dämonprozesse selbst erstellen können und wie sie (Fehler)Meldungen dieser Prozessen anzeigen bzw. protokolieren können. Wir werden bei der Netzwerkprogrammierung dieses Thema wieder aufgreifen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf