9.5. LPD (Line Printer Daemon)

Drucken im Hintergrund wird Spooling genannt. Ein Spooler (Warteschlange) ermöglicht es dem Benutzer die Programme auf dem Rechner fortzusetzen, ohne warten zu müssen bis der Druckauftrag abgeschlossen ist.

FreeBSD enthält den Spooler namens lpd(8). Druckaufträge werden mit lpr(1) übermittelt.

9.5.1. Konfiguration

Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge und setzen Sie die Berechtigungen auf diesem Verzeichnis, damit der Inhalt der Druckaufträge nicht von anderen Benutzern eingesehen werden kann:

# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp

Drucker werden in /etc/printcap angelegt. Ein Eintrag für einen Drucker enthält dessen Name, Anschluss sowie weitere Einstellungen. Erstellen Sie /etc/printcap mit folgendem Inhalt:

lp:\				1
	:lp=/dev/unlpt0:\	2
	:sh:\			3
	:mx#0:\			4
	:sd=/var/spool/lpd/lp:\	5
	:lf=/var/log/lpd-errs:	6

1

Der Name des Druckers. lpr(1) sendet Druckaufträge an den Drucker lp, es sei denn, ein anderer Drucker wird mit der Option -P angegeben. Der Standarddrucker sollte also lp genannt werden.

2

Der Anschluss, über den der Drucker verbunden ist. Ersetzen Sie diese Zeile mit dem entsprechenden, hier aufgeführten Verbindungstyp.

VerbindungstypGerätename in /etc/printcap
USB
:lp=/dev/unlpt0:\

Der USB-Drucker. Falls Probleme auftauchen, verwenden Sie stattdessen ulpt0, das den USB-Anschluss nach jedem Gebrauch zurücksetzt.

Parallel
:lp=/dev/lpt0:\
Netzwerk

Für einen Drucker, der das LPD-Protokoll unterstützt:

:lp=:rm=network-printer-name:rp=raw:\

Für Drucker, die den Druck über Port 9100 unterstützen:

:lp=9100@network-printer-name:\

Ersetzen Sie für beide Typen network-printer-name durch den DNS-Namen des Netzwerkdruckers.

Seriell
:lp=/dev/cuau0:br=9600:pa=none:\

Diese Werte sind für einen typischen seriellen Drucker geeignet. Die Baudrate beträgt 9600 und es wird keine Parität benutzt.

3

Unterdrückt das Drucken eines Deckblattes zu Beginn des Druckauftrags.

4

Die maximale Größe des Druckauftrags wird nicht begrenzt.

5

Das Verzeichnis zur Speicherung der Druckdaten. Jeder Drucker verwendet ein eigenes Verzeichnis.

6

Die Logdatei, in welche die Fehler des Druckers geschrieben werden.

Nachdem Sie /etc/printcap erstellt haben, verwenden Sie chkprintcap(8) um die Datei auf Fehler zu testen:

# chkprintcap

Beheben Sie alle gemeldeten Fehler, bevor Sie fortfahren.

Aktivieren Sie lpd(8) in /etc/rc.conf:

lpd_enable="YES"

Starten Sie den Dienst:

# service lpd start

9.5.2. Drucken mit lpr(1)

Mit lpr werden Dokumente an den Drucker geschickt. Die Datei können Sie auf der Kommandozeile angeben, oder über eine Pipe an lpr schicken. Die beiden folgenden Kommandos sind gleichwertig, sie schicken den Inhalt von doc.txt an den Standarddrucker:

% lpr doc.txt
% cat doc.txt | lpr

Drucker können auch mit -P ausgewählt werden. Um auf einen Drucker namens laser zu drucken:

% lpr -Plaser doc.txt

9.5.3. Filter

In den bisher gezeigten Beispielen wurde lediglich eine Textdatei an den Drucker gesendet. Solange der Drucker den Inhalt dieser Dateien versteht, wird die Ausgabe korrekt gedruckt werden.

Einige Drucker sind nicht in der Lage einfachen Text zu drucken. Es kann sogar sein, das die Eingabedatei gar keinen Text enthält.

Mit Hilfe von Filtern können Dateien übersetzt oder verarbeitet werden. Ein typischer Anwendungsfall ist die Umwandlung der Eingabedaten in ein Format, das der Drucker verstehen kann, wie bspw. PostScript® oder PCL. Filter können auch verwendet werden um zusätzliche Funktionen hinzuzufügen, wie bspw. Seitenzahlen oder das Hervorheben von Quellcode, um die Lesbarkeit zu verbessern.

Die hier beschriebenen Filter werden Eingabefilter oder auch Textfilter genannt. Diese Filter übersetzen die eingehende Datei in verschiedene Formen. Werden Sie mit su(1) zu root, bevor Sie die Dateien erstellen.

Filter werden in /etc/printcap mit der Kennung if= festgelegt. Um /usr/local/libexec/lf2crlf als Filter einzusetzen, bearbeiten Sie /etc/printcap wie folgt:

lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   1
	:lf=/var/log/lpd-errs:

1

if= identifiziert den Eingangsfilter, der auf den eingehenden Text angewendet werden soll.

Tipp:

Der Backslash am Ende der Zeilen zeigt an, das ein Eintrag für einen Drucker wirklich nur eine Zeile ist, in der die einzelnen Einträge durch einen Doppelpunkt getrennt sind. Das Beispiel hätte man auch wie folgt schreiben können:

lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:

9.5.3.1. Den Treppeneffekt verhindern

Typische Textdateien enthalten einen Zeilenvorschub am Ende jeder Zeile. Diese Zeilen erzeugen auf dem Drucker einen Treppeneffekt:

A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind

Ein Filter kann Zeilenumbrüche in Wagenrückläufe und Zeilenumbrüche konvertieren. Erstellen Sie /usr/local/libexec/lf2crlf mit folgendem Inhalt:

#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

# chmod 555 /usr/local/libexec/lf2crlf

Passen Sie /etc/printcap an, so dass der neue Filter verwendet wird:

:if=/usr/local/libexec/lf2crlf:\

Drucken Sie nochmal die gleiche Datei, um den Filter zu testen.

9.5.3.2. Mit print/enscript normalen Text auf PostScript®-Druckern drucken

GNU Enscript wandelt Textdateien in formatiertes PostScript® um, die dann auf PostScript®-Druckern gedruckt werden können. Das Programm fügt auch Seitenzahlen und Zeilenumbrüche hinzu und stellt andere Funktionen bereit, um gedruckte Textdateien besser lesbar zu machen. Abhängig vom Papierformat können Sie entweder print/enscript-letter oder print/enscript-a4 aus der Ports-Sammlung installieren.

Erstellen Sie /usr/local/libexec/enscript mit diesem Inhalt:

#!/bin/sh
/usr/local/bin/enscript -o -

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

# chmod 555 /usr/local/libexec/enscript

Bearbeiten Sie /etc/printcap um den neuen Filter zu verwenden:

:if=/usr/local/libexec/enscript:\

Testen Sie den Filter, indem Sie eine einfache Textdatei drucken.

9.5.3.3. PostScript® auf PCL-Druckern drucken

Viele Programme erzeugen PostScript®-Dokumente. Allerdings können kostengünstige Drucker oft nur Textdateien oder PCL verstehen. Dieser Filter wandelt PostScript®-Dateien in PCL um, bevor die Datei an den Drucker geschickt wird. Installieren Sie den Ghostscript PostScript® Interpreter print/ghostscript9-base aus der Ports-Sammlung.

Erstellen Sie /usr/local/libexec/ps2pcl mit diesem Inhalt:

#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

# chmod 555 /usr/local/libexec/ps2pcl

Die PostScript®-Eingabe wird von dem Skript erst in PCL umgewandelt, bevor es an den Drucker geschickt wird.

Bearbeiten Sie /etc/printcap um den neuen Filter zu verwenden:

:if=/usr/local/libexec/ps2pcl:\

Testen Sie den Filter mit einem kleinen PostScript®-Programm.

% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr

9.5.3.4. Intelligente Filter

Ein Filter kann sehr nützlich sein, wenn er die Eingabe erkennt und sie automatisch in ein für den Drucker verständliches Format umwandelt. Die ersten beiden Zeichen in einer PostScript®-Datei sind in der Regel %!. Ein Filter ist in der Lage diese beiden Zeichen zu erkennen. PostScript®-Dateien können unverändert an einen PostScript®-Drucker geschickt werden. Textdateien können, wie eben gezeigt, mit Enscript in PostScript® umgewandelt werden. Erstellen Sie /usr/local/libexec/psif mit diesem Inhalt:

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript job, print it.
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # otherwise, format with enscript
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

# chmod 555 /usr/local/libexec/psif

Bearbeiten Sie /etc/printcap um den neuen Filter zu verwenden:

:if=/usr/local/libexec/psif:\

Um den Filter zu testen, drucken Sie PostScript®- und einfache Textdateien.

9.5.3.5. Weitere intelligente Filter

Einen Filter zu schreiben, der verschiedene Arten von Eingaben erkennen und formatieren kann, ist eine große Herausforderung. print/apsfilter aus der Ports-Sammlung ist auch ein intelligenter Filter, der Dutzende Dateitypen automatisch in eine für den Drucker verständliche PDL umwandeln kann. Weitere Details finden Sie auf http://www.apsfilter.org.

9.5.4. Mehrere Warteschlangen

Die Einträge in /etc/printcap sind nichts anderes als Definitionen von Warteschlangen. Für jeden Drucker können eine oder mehrere Warteschlangen definiert werden. Kombiniert mit Filtern bieten mehrere Warteschlangen eine bessere Kontrolle über die Druckaufträge.

Als Beispiel dient ein vernetzter PostScript®-Laserdrucker in einem Büro. Die meisten Benutzer möchten einfache Textdateien drucken, aber ein paar fortgeschrittene Anwender sollen in der Lage sein, PostScript®-Dateien direkt zu drucken. Hierfür werden zwei Einträge für den Drucker in /etc/printcap erstellt:

textprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/textprinter:\
	:if=/usr/local/libexec/enscript:\
	:lf=/var/log/lpd-errs:

psprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/psprinter:\
	:lf=/var/log/lpd-errs:

Dokumente, die zum textprinter geschickt werden, werden wie im vorherigen Beispiel durch den Filter /usr/local/libexec/enscript formatiert. Fortgeschrittene Anwender können PostScript®-Dateien direkt auf dem Drucker psprinter drucken, wo keine Filterung stattfindet.

Mit mehreren Warteschlangen können Sie einen direkten Zugriff auf alle Arten von Druckerfunktionen zur Verfügung stellen. Ein Duplex-Drucker könnte zwei Warteschlangen verwenden, eine für den gewöhnlichen Druck und eine für den Duplexdruck.

9.5.5. Druckaufträge steuern und überwachen

Es stehen verschiedene Programme zur Verfügung um Druckaufträge zu überwachen und den Druckbetrieb zu steuern.

9.5.5.1. lpq(1)

lpq(1) zeigt den Status der Druckaufträge des Benutzers an. Druckaufträge anderer Benutzer werden nicht angezeigt.

Dieser Befehl zeigt die anstehenden Druckaufträge eines Benutzers für einen Drucker an:

% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes

Der folgende Befehl zeigt die anstehenden Druckaufträge eines Benutzers für alle Drucker an:

% lpq -a
lp:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     1    (standard input)                      27320 bytes

laser:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     287  (standard input)                      22443 bytes

9.5.5.2. lprm(1)

Mit lprm(1) können Druckaufträge gelöscht werden. Normale Benutzer dürfen lediglich ihre eigenen Aufträge löschen. root kann hingegen jeden beliebigen Auftrag löschen.

Dieser Befehl löscht alle anstehenden Druckaufträge eines Druckers:

# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued

Mit dem folgenden Befehl löschen Sie einen bestimmten Druckauftrag. Benutzen Sie lpq(1), um die Nummer des Auftrags zu finden.

% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes
% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued

9.5.5.3. lpc(8)

Mit lpc(8) kann der Druckerstatus überprüft und verändert werden. lpc wird zusammen mit einem Kommando und optional mit einem Druckernamen aufgerufen. Mit all können alle Drucker angesprochen werden, auf denen das Kommando ausgeführt werden soll. Normale Benutzer können sich den Status mit lpc(8) ansehen. Nur root darf Kommandos ausführen, die den Status des Druckers verändern.

Dieser Befehl zeigt den Status von allen Druckern an:

% lpc status all
lp:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	printer idle
laser:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	waiting for laser to come up

Der Drucker kann die Annahme neuer Druckaufträge verweigern. Anschließend sollen Aufträge wieder akzeptiert werden:

# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started

Starten Sie den Drucker nach einem Fehler neu:

# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted

Schalten Sie die Warteschlange aus und deaktivieren Sie den Druck. Sie können den Benutzern gleichzeitig eine Nachricht hinterlassen:

# lpc down lp Ersatzteile werden am Montag ankommen
lp:
	printer and queuing disabled
	status message is now: Ersatzteile werden am Montag ankommen

Reaktivieren Sie den Drucker:

# lpc up lp
lp:
	printing enabled
	daemon started

Weitere Kommandos und Optionen finden Sie in lpc(8).

9.5.6. Gemeinsam genutzte Drucker

In Unternehmen und Schulen werden Drucker häufig von mehreren Benutzern genutzt. Es werden zusätzliche Funktionen angeboten, um die gemeinsame Nutzung von Druckern zu erleichtern.

9.5.6.1. Aliase

Der Druckername wird in der ersten Zeile von /etc/printcap festgelegt. Weitere Namen oder Aliase können nach dem Druckernamen hinzugefügt werden. Aliase werden vom Namen durch das Pipe-Zeichen | getrennt:

lp|repairsprinter|salesprinter:\

Anstelle des Druckernamens können Aliase verwendet werden. Zum Beispiel können Mitarbeiter der Verkaufsabteilung wie folgt auf ihren Drucker drucken:

% lpr -Psalesprinter sales-report.txt

Mitarbeiter der Reparaturabteilung drucken auf dem Drucker mit:

% lpr -Prepairsprinter repairs-report.txt

Alle Dokumente werden auf diesem einen Drucker gedruckt. Wenn die Verkaufsabteilung größer wird und die Abteilung einen eigenen Drucker benötigt, kann der Alias entfernt und für einen neuen Drucker verwendet werden. Die Mitarbeiter in beiden Abteilungen benutzen zum Drucken weiterhin die gleichen Befehle, nur dass die Aufträge der Verkaufsabteilung jetzt zum neuen Drucker gesendet werden.

9.5.6.2. Deckblätter

Bei einem viel benutzten Drucker kann es für die Anwender schwierig sein, ihre Dokumente in einem großen Papierstapel wiederzufinden. Um dieses Problem zu lösen, können Deckblätter verwendet werden. Dabei wird vor jedem Druckauftrag ein Deckblatt mit dem Benutzernamen und dem Dokumentnamen gedruckt. Deckblätter werden manchmal auch als Banner oder Trennseite bezeichnet.

Das Aktivieren der Deckblätter hängt davon ab, ob der Drucker direkt über ein USB, paralleles oder serielles Kabel, oder über ein Netzwerk mit dem Rechner verbunden ist.

Wenn der Drucker direkt verbunden ist, aktivieren Sie die Deckblätter durch Entfernen der Zeile :sh:\ (Supress Header) in /etc/printcap. Diese Deckblätter verwenden lediglich einen Zeilenvorschub für neue Zeilen. Einige Drucker benötigen den Filter /usr/share/examples/printing/hpif um den Treppeneffekt zu vermeiden. Der Filter konfiguriert PCL-Drucker so, dass sowohl Zeilenumbrüche als auch Zeilenvorschübe verwendet werden, wenn ein Zeilenvorschub empfangen wird.

Für Netzwerkdrucker müssen Deckblätter auf dem Drucker selbst konfiguriert werden, da Einträge für Deckblätter in /etc/printcap ignoriert werden. Die Einstellungen sind über einen Webbrowser zugänglich und stehen in der Regel auf der Hauptseite der Konfigurations-Webseite zur Verfügung.

9.5.7. Referenzen

Beispieldateien: /usr/share/examples/printing/.

Das 4.3BSD Line Printer Spooler Manual, /usr/share/doc/smm/07.lpd/paper.ascii.gz.

Manualpages: printcap(5), lpd(8), lpr(1), lpc(8), lprm(1), lpq(1).

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.