Next: Der Batchdämon crond
Up: Systemverwaltung
Previous: Datensicherung
Bereits bei den urtümlichen Vorfahren unseres heutigen Linux hat sich eine besondere Gruppe von Programmen entwickelt, die in symbiotischer Beziehung zum Betriebssystemkern stehen. Sie arbeiten automatisch und erfüllen immer wiederkehrende Aufgaben. Weil sie vom normalen Benutzer niemals direkt aufgerufen werden, also ihre Arbeit unsichtbar im Hintergrund erledigen, werden sie als Dämonen bezeichnet.
Ein typischer Dämon ist der lpd, der Line Printer Dämon. Dieser Dämon kann die Druckaufträge (Jobs) eines Anwenders entgegennehmen und sie auf einen geeigneten Drucker weiterleiten. Gegenüber dem ebenfalls möglichen Verfahren der direkten Übertragung an einen Drucker, beispielsweise mit dem cat-Kommando, hat die Benutzung des Dämons eine Reihe von Vorteilen.Als ordentlicher Dämon tritt der lpd nicht direkt in Erscheinung. Für den Anwender sind die Kommandos lpr, lpq und lprm vorgesehen.
Mit dem lpr-Kommando können Sie ein Dokument an den Druckerdämon übergeben. Damit wird der im Hintergrund schlafende Dämon aktiviert, der das Dokument in das Spoolverzeichnis kopiert und eine zusätzliche Befehlsdatei schreibt. Auf diese Weise entsteht ein Druckjob, der sich in die Warteschlange (Queue) des Druckerdämons einreiht.
Mit dem Kommando lprm (line printer remove) kann ein abgeschickter Druckjob angehalten werden. Das lpq-Kommando zeigt den aktuellen Status der Druckerwarteschlange, das ist die Liste aller unbearbeiteten Jobs.
Die Systemverwalterin kann mit dem lpc (line printer control) Kommando den Status des Druckerdämons überprüfen und verändern.
Erwartungsgemäß muß ein Dämon, der seine Arbeit ja ohne direkten Kontakt mit dem Benutzer erledigt, von der Systemverwalterin konfiguriert werden.
Dazu dient die Datei /etc/printcap, in der das grundsätzliche Verhalten des Dämons eingestellt werden kann, sowie eine Reihe von Filtern, mit denen der Dämon aus rohen Texten wohlgesetzte Dokumente destilliert.
Wenn der Druckerdämon korrekt läuft, sollte er in der Datei /etc/rc.local (oder in einer vergleichbaren Datei) beim Systemstart automatisch aufgerufen werden.
Um den Druckerdämon netzwerkfähig zu machen, müssen alle Rechner, von denen der Zugriff auf den lokalen Drucker erlaubt werden soll, in der Datei /etc/hosts.equiv oder /etc/hosts.lpr aufgeführt werden.
In einer Datei mit dem Namen minfree im Spoolverzeichnis des Dämons kann eine Anzahl Plattenblöcke festgelegt werden, die vom Dämon freigehalten wird.
Jede Zeile, die nicht von einem # eingeleitet wird, definiert einen Drucker im System. Wenn ein Eintrag über mehrere Zeilen gehen soll, muß das Zeilenende durch einen Backslash versteckt werden. Ein Eintrag besteht aus mehreren Feldern, die durch Doppelpunkte voneinander getrennt werden. Das erste Feld enthält den Namen, unter dem der Drucker angesprochen wird. Die anderen Felder belegen Variable oder setzen Schalter zur Einstellung des Druckerdämons. Die Zuweisung an Zeichenvariable erfolgt mit dem Gleichheitszeichen, numerische Variable werden mit dem Nummernzeichen # belegt.
Die folgenden Variablen können mit Zeichenketten (Wörter, Namen) belegt werden.
Ein typischer Eintrag sieht beispielsweise so aus:
# Standarddrucker an lp1 mit Spoolverzeichnis lp1 und Filter lpf lp:lp=/dev/lp1:sd=/var/spool/lp1:of=/usr/lib/lpf:lf=/var/adm/lp:mx#0In diesem Beispiel wird ein Drucker an der ersten parallelen Schnittstelle /dev/lp1 unter dem Namen
lp
definiert.
Als Spoolverzeichnis (sp) wird /var/spool/lp1 verwendet, als
Ausgabefilter (of) wird das Programm lpf festgelegt,
durch die Zuweisung des Wertes 0 an die Variable mx werden
beliebig große Dokumente zugelassen, und als Logfile wird die Datei
/usr/adm/lp bestimmt. Vorausgesetzt, die genannten Verzeichnisse
und Dateien existieren, sollte mit diesem Eintrag der erste
Probeausdruck möglich sein.
Eine kleine Veränderung des Beispieleintrages veranlaßt den Druckerdämon dazu, das Dokument über das TCP/IP-Netzwerk an einen anderen Rechner zu schicken und von dem dortigen Druckerdämon verarbeiten zu lassen:
# Standarddrucker ueber Netz an Rechner soho lp:lp=:rm=soho:lf=/usr/adm/lpd-errs:
Mit Ausnahme des Papierformates sind in der printcap-Datei keine Informationen über die genaue Ansteuerung des Druckers gespeichert. Das bedeutet, daß der Druckerdämon nicht einmal einen Reset oder eine Druckerinitialisierung selbst ausführen kann. Trotzdem kann ein gut eingerichteter lpd eine Vielzahl unterschiedlicher Formate auf jedem angeschlossenen Drucker ausgeben, vorausgesetzt, die Systemverwalterin hat die passenden Filter installiert.
Der lpd kann einen Ausgabefilter (of) und bis zu neun Eingabefilter (cf, df, gf, if, nf, rf, tf, vf und pr, siehe oben) benutzen.
Der Ausgabefilter ist in erster Linie dazu gedacht, die Ausgabe der vom lpd selbst generierten Titelseiten am Beginn jedes Druckjobs zu filtern. Weil eine eventuell notwendige Druckerinitialisierung bereits für diese Titelseite sinnvoll ist, sollte der Ausgabefilter auch diese Aufgabe erfüllen.
Das Zusammenspiel des Ausgabefilters mit dem lpd ist insofern etwas kompliziert, als dieser nur einmal zu Beginn des ersten Druckjobs gestartet wird. Für den Ausdruck der eigentlichen Dokumente benutzt der Druckerdämon einen der Eingabefilter und hält den Ausgabefilter bis zum Beginn des nächsten Jobs an. Dazu schreibt der Dämon die Zeichenkette '\031\1' in die Standardeingabe des Ausgabefilters. Der Filter muß sich daraufhin selbst mit SIGSTOP anhalten und auf das SIGCONT-Signal warten.
Die Zahl möglicher Formate, in denen ein Dokument vorliegen kann, und die Zahl möglicher Druckersprachen, in die dieses Format umgewandelt werden muß, um tatsächlich auf dem Papier zu erscheinen, ist so groß, daß es keine einfache Methode gibt, diese Übersetzung direkt vom Druckerdämon ausführen zu lassen.
Deshalb muß die Systemverwalterin dem lpd für jedes Eingabeformat einen Eingabefilter bereitstellen, der dieses Format für den installierten Drucker aufbereitet.
Das Zusammenwirken des lpd mit den Eingabefiltern ist sehr einfach. Mit einer der Optionen c, d, f, g, n, p, t und v gibt der Benutzer beim Aufruf von lpr an, welches Format sein Dokument hat, und bestimmt so, welcher Eingabefilter benutzt wird. Dieser Filter wird dann vom lpd für den Ausdruck des bei diesem Aufruf von lpr bestimmten Dokumentes in einer Pipeline gestartet. Der Dämon ruft den if-Filter mit folgender Kommandozeile auf:
if [-c] -wSpalten -lZeilen -i Einrückung -n Name -h Host Accountdatei
Die -c Option ist gesetzt, wenn der lpr mit der Option -l aufgerufen wurde. Alle anderen Eingabefilter werden mit der Zeile
filter -x Breite -y Länge -n Name -h Host Accountdatei
aufgerufen.
Während ein Eingabefilter aktiv ist, bleibt der Ausgabefilter angehalten. Der Eingabefilter liest aus der Pipeline (Standardeingabe), verändert den Datenstrom seinem Programm entsprechend und schreibt die Daten in die Standardausgabe, die direkt mit dem Drucker verbunden ist.
So ein Filter kann ein vollständiges C-Programm sein. Das dem lpd-Paket beiliegende Programm lpf ist beispielsweise ein Eingabefilter speziell für groff-Dokumente.
Als Eingabefilter können aber auch Shellscripts oder perl-Programme verwendet werden. Auf diese Weise kann zum Beispiel die Umwandlung einer Postscriptdatei für einen Epson-Nadeldrucker mit dem Ghostscript-Interpreter gs erfolgen:
#!/bin/bash # gs -q -dNOPAUSE -sDEVICE=EPSON -sOutputFile=- -
Ein schönes Beispiel für die vielfältigen Möglichkeiten, einen Filter zu bauen, ist das magicfilter von Peter Anvin. Dieses Shellprogramm benutzt ``Magische Zahlen'' zur Erkennung der Dateiformate, ähnlich wie file. Der Magische Filter koordiniert die Zusammenarbeit verschiedener Programme um eine Datei möglichst optimal für einen bestimmten Drucker aufzubereiten. Sie finden die Sourcen zu diesem Filter im Internet, beispielsweise auf allen Mirrors von ftp://sunsite.unc.edu im Verzeichnis Linux/system/Printing.
Das Linux Anwenderhandbuch