Dieses Handbuch wird mit freundlicher Genehmigung von Sebastian Hetze auf den Servern der Linux Information Systems AG gehosted.

next up previous contents index
Next: Der Batchdämon crond Up: Systemverwaltung Previous: Datensicherung

Subsections


Der Druckerdämon lpd

      

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.

Den lpd erziehen

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.

/etc/printcap

   Die printcap[*]-Datei beschreibt das Spoolsystem und die Druckerfilter.

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.

lp=
Die Gerätedatei des Druckers. Für Netzwerkdrucker an anderen Hosts muß diese Variable leer definiert werden, damit der voreingestellte Drucker gelöscht wird. Die Voreinstellung ist meistens /dev/lp.
rm=
Der Name des Remote Host, an dem der Netzwerkdrucker angeschlossen ist.
rg=
Die Benutzergruppe, deren Mitglieder den Drucker benutzen dürfen.
rp=
Name des Druckers am Remote Host. Voreingestellt ist der Standarddrucker lp.
lo=
Name der Lockdatei. Voreinstellung ist lock. Das Lockfile wird im Spoolverzeichnis des Druckers vom Druckerdämon (Kind) angelegt.
st=
Name des Statusfiles. Voreinstellung ist status. Die Statusdatei wird vom Druckerdämon (Kind) im Spoolverzeichnis des Druckers angelegt.
sd=
Der Name des Spoolverzeichnisses. Voreingestellt ist, je nach Distribution, /var/spool/lpd oder /usr/spool/lpd.[*]
af=
Name der Abrechnungsdatei. Der Name dieser Datei wird den Eingabefiltern übergeben, die dort Informationen über den Umfang des Druckjobs ablegen sollten, mit denen die Systemverwalterin die Druckkosten mit den Benutzern abrechnen kann.
ff=
Die Zeichenkette für den Seitenvorschub.
tr=
(trailer) Diese Zeichenkette wird nach Beendigung des letzten Druckjobs ausgegeben.
lf=
Name des Logbuchs. In dieser Datei werden die Fehlermeldungen des Druckerdämons gespeichert.

Die folgenden Variablen bestimmen die Filter zur Aufbereitung der zu druckenden Dateien.
of=
Der Name des Ausgabefilters.
if=
Name des (Standard-) Eingabefilters
rf=
Name des FORTRAN-Textfilters. Dieser Filter wird von lpr mit der -r Option ausgewählt.
tf=
Name des troff-Filters. Dieser Filter wird von lpr mit der Option -t ausgewählt.
nf=
Name des ditroff-Filters. Dieser Filter wird von lpr mit der Option -n ausgewählt.
df=
Name des TEX-Filters. Dieser Filter wird von lpr mit der Option -d ausgewählt.
gf=
Name des graph-Filters. Dieser Filter wird von lpr mit der Option -g ausgewählt.
vf=
Name des Rastergrafik-Filters. Dieser Filter wird von lpr mit der Option -v ausgewählt.
cf=
Name des cifplot-Filters. Dieser Filter wird von lpr mit der Option -c ausgewählt.

Die folgenden Variablen können mit numerischen Werten (Zahlen) belegt werden.
mx#
Die maximale Blockzahl (Größe) eines Druckjobs. Durch die Zuweisung mx#0 wird die Jobgrößenbeschränkung abgeschaltet.
mc#
Die maximale Anzahl erlaubter Kopien eines Druckjobs.
pw#
Die (maximale) Spaltenzahl einer Druckseite.
px#
Die Breite einer Druckseite in Pixeln.
pl#
Die (maximale) Zeilenzahl einer Druckseite.
py#
Die Höhe einer Druckseite in Pixeln.

Die folgenden Schalter verändern das Verhalten des Druckerdämons.
rs
Der Zugriff auf einen Netzwerkdrucker ist nur denjenigen Anwendern gestattet, die einen Account auf dem Host mit dem Drucker haben.
sc
Verbietet mehrfachen Ausdruck eines Dokumentes.
sf
Unterdrückt die Ausgabe eines Seitenvorschubs nach jedem Druckjob.
sh
Unterdrückt die Ausgabe einer Titelseite vor jedem Druckjob.
sb
Verkürzt die Titelseite auf eine Zeile.
hl
Veranlaßt den Druckerdämon, die Titelseite nach jedem Druckjob zu schreiben.
rw
Öffnet den Drucker zum Lesen und Schreiben.

Die folgenden numerischen Variablen stellen die Schnittstelle für serielle Drucker ein.
br#
Die Baudrate, wenn der Drucker an einer seriellen Schnittstelle hängt.
fc#
Löscht die im Argument gesetzten Bits.
fs#
Setzt die im Argument gesetzten Bits.
xc#
Löscht die im Argument gesetzten local-mode-Bits.
xs#
Setzt die im Argument gesetzten local-mode-Bits.

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#0
In 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:

Die Druckerfilter

   

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

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 Eingabefilter

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.

     


next up previous contents index
Next: Der Batchdämon crond Up: Systemverwaltung Previous: Datensicherung

Das Linux Anwenderhandbuch
(C) 1997 LunetIX