Im LinuxUser 06/2000 entlockten wir einem SMB-Drucker im Microsoft-Netzwerk an dieser Stelle mit viel Mühe und einem Skript sinnvolle Druckerzeugnisse. Nun mag Unix-verwöhntes Volk jedoch gar nicht einsehen, wieso es ausgerechnet für diesen Drucker eine Ausnahme machen sollte: Alle anderen Drucker lassen sich mit dem lpr-Kommando ansprechen, und nur hier gibt's ein Extraskript?
Tabelle 1: Gängige Druckkommandos unter Linux
lpr -Pdrucker datei
|
druckt datei auf dem Drucker namens drucker aus. Lässt man die Option -Pdrucker weg, landet der Druckjob in der Druckerwarteschlange zum Standarddrucker lp, sofern ein solcher in der /etc/printcap definiert ist.
|
lpq -Pdrucker
|
zeigt alle Jobs an, die in der Drucker-Queue von drucker auf ihren Ausdruck warten. Ohne -Pdrucker ist wieder die Standardwarteschlange gemeint. Mit lpq erfährt man die Jobnummer eines Druckjobs.
|
prm -Pdrucker Jobnummer
|
entfernt ("removes") den Druckjob Nr. Jobnummer aus der Warteschlange des druckers bzw. ohne explizite -P-Angabe des Standarddruckers. Gibt man als Jobnummer ein Minus ("-") an, werden alle eigenen Jobs gelöscht.
|
Wo bleibt der Druckerspool?
Nicht mit uns: Der SMB-Drucker soll eine ebensolche Druckerwarteschlange bekommen, auf die für ihn bestimmte Druckjobs abgelegt und abgearbeitet werden.
Mit Tools wie Red Hats printtool ist man da natürlich fein raus – einfach Parameter eintragen und fertig (Abbildung 1 und 2). Doch auch sonst ist nicht alles verloren: Der Schlüssel zum Druckerglück liegt in einer Datei mit dem schönen Namen /etc/printcap, der unter man printcap auch eine eigene Manpage gewidmet ist.
Glücklicherweise findet sich nur ausgesprochen selten eine völlig leere printcap, und mit Beispieleintrag, zugehöriger Manpage und vielleicht noch [3] bewaffnet, kann es sich nur um Stunden handeln, bis wir etwas Sinnvolles auf die Beine gestellt bekommen.
Was sofort auffällt, ist die Struktur eines Eintrags:
name_1|name_2|...|name_n: \
:string_option_1=string_wert_1: \
:[...]: \
:num_option_x#num_wert_x: \
:[...]: \
:bool_option:
In der ersten Zeile werden, mit dem logischen ODER-Zeichen | voneinander abgetrennt, all jene Namen angegeben, unter denen der Drucker mit lpr -PName datei angesprochen werden kann. Ein printcap-Eintrag sollte (u.a.) lp heißen, wenn man auch ohne die -P-Option bei einem Drucker landen will. Der Doppelpunkt : beschließt das Ende der Namensliste und leitet die Aufzählung von Eigenschaften der entsprechenden Druckerwarteschlange ein.
Wie aus der printcap-Manpage ersichtlich, gibt es Charakteristika dreierlei Art: Optionen, die als Wert eine hinter einem Gleichheitszeichen angegebene Zeichenkette (einen "String") verlangen, numerische Werte, die vom Optionsnamen durch # getrennt werden, und Ja/Nein- ("Boolsche") Optionen, die nur dann aufgeführt werden, wenn sie auf "Ja" gesetzt werden sollen: Nicht aufgeschrieben bedeutet hier "woll'n wir nicht".
Jede Option muss links und rechts von : umrahmt werden. In praxi ist jeder printcap-Eintrag schlichtweg eine lange Zeile; der Übersichtlichkeit halber kann man den Zeilenumbruch jedoch mit \ maskieren. Da allerdings jede Option sozusagen nicht über den Tellerrand der eigenen in der Datei stehenden Zeile hinweg schauen kann, muss man in diesem Fall den letzten : noch einmal am Zeilenbeginn wiederholen.
Das große Ganze
Im Wust der ganzen Optionen findet man sich am besten zurecht, wenn man sich überlegt, wie das Drucken eigentlich vonstatten geht. Zunächst nimmt das Programm lpr ("line printer") den Druckauftrag entgegen und bringt ihn in der passenden Druckerwarteschlange unter.
Irgendwann kommt dann der Lineprinter-Dämon lpd daher, schnappt sich den ersten wartenden Job aus der Schlange und bereitet ihn auf den Ausdruck vor. Das, was er da tut, haben wir in Heft 06/2000 selbst von Hand durchexerziert: Wir suchten uns einen Filter, der aus den verschiedenen Formaten, die eine auszudruckende Datei haben kann, das Format macht, das der Drucker versteht – in der Regel PostScript oder PCL.
Außerdem kann der lpd noch ein paar Dinge entscheiden: z.B. ob er die Datei überhaupt ausdrucken will, wenn er sieht, dass sie so groß ist, dass der Drucker auf zwei Stunden komplett beschäftigt wäre. Zum guten Schluss schiebt der lpd dem Drucker die Daten zu, sofern der gerade nichts zu tun hat.
Die Printcap muss demnach folgende Informationen enthalten:
- den Namen des Druckers,
- die Gerätedatei, über die er angesprochen werden kann, also den "
lineprinter" selbst:lp=/dev/xxx, wobeixxxfür einen lokalen Drucker z.B. die parallele Schnittstelle lp1 sein kann, - die Warteschlange, also ein Verzeichnis ("
directory"), in dem die Druckjobs "aufgespult" werden:sd=/var/spool/lpd/xxx. Der Name des Druckerspools,xxx, ist Ihrer Fantasie überlassen, sinnvollerweise heißt er in etwa so wie Ihr Drucker, - der "
Input-" oder Eingabe-Filter, der am Ende das für den Drucker passende Format ausspuckt:if=/pfad/zum/filterund - ggf. ein paar Sondereigenschaften wie
mx#xxx, wobeixxxdie maximale Dateigröße festlegt. Dass diese als Vielfaches eines Kilobytes angegeben wird, bekommt man allerdings erst mit ein wenig Recherche heraus [1,2].



