Aufmacher Artikel

Druck auf Befehl

Drucker von der Kommandozeile steuern

01.10.2001 In der Regel druckt es sich bequem über entsprechende Dialoge in den Anwendungen. Wer Dateien aber noch mit Filtern nachbearbeiten möchte, muss anschließend von Hand drucken: Wir geben eine Einführung in lpr & Co.

Grafische Anwendungen, etwa Office-Pakete oder Zeichenprogramme wie Gimp, bieten dem Anwender zum Ausdruck eines Dokumentes unterschiedlich ausführliche und komfortable Druckdialoge. Hier kann kurz vor dem Ausdruck noch allerlei eingestellt werden, etwa eine Skalierung der Druckseiten, die Reihenfolge mehrerer Seiten, oder eine "2-auf-1"-Funktion. Unabhängig davon, mit welcher Anwendung Sie arbeiten, landen aber schließlich alle Druckausgaben beim Hilfsprogramm lpr (traditionell: Line Printer), welches je nach Konfiguration verschiedene Filter auf die übergebenen Druckdaten anwendet und schließlich einen neuen Eintrag in der gewünschten Drucker-Warteschlangeerzeugt.

Abbildung 1

Abbildung 1: Gimp erwartet die Angabe des Druckbefehls

Jeder dieser Einträge hat in der Regel seinen Weg durch das Drucksystem als PostScript-Datei begonnen, die von der Anwendung erzeugt wurde - es ist dann Aufgabe des Drucksystems, diese PostScript-Daten in ein Format zu konvertieren, das der angeschlossene Drucker versteht (sofern er nicht eh PostScript beherrscht).

Über die grundsätzlichen Techniken, welche die verschiedenen Drucksysteme (LPRng, CUPS etc.) einsetzen, haben Sie sich schon in den Artikeln ab Seite 38 informieren können - hier geht es nun ausschließlich um die Kommandozeilen-Programme

  • lpr (Eintrag in die Druckerwarteschlange aufnehmen),
  • lpq (Warteschlange anzeigen),
  • lprm (Eintrag aus Warteschlange löschen) und
  • lpc (Drucker anhalten, Warteschlange suspendieren etc.).

Häufig ist es sinnvoll, die Druckausgabe eines Programmes zunächst in eine PostScript-Datei zu schreiben und dann weiter zu verarbeiten: Eine Anwendung dafür finden Sie etwa im "Zu Befehl" ab S. 60. Somit lohnt es sich, die Syntax von lpr & Co. kennen zu lernen.

lpr liest stdin

Das sicher wichtigste Programm ist lpr: Es nimmt die neuen Druckaufträge entgegen und sorgt für ihren korrekten Eintrag in die Warteschlange. Prinzipiell kann lpr auf zwei Arten aufgerufen werden:

[esser@dual lpr]$ lpr datei.ps

wird die Datei datei.ps auf dem Standard-Drucker ausdrucken. Welcher Drucker das ist (falls Sie mehrere angeschlossen haben oder über das Netzwerk erreichen können), erfahren Sie weiter unten. Es können hier auch mehrere Dateinamen übergeben werden, und je nach Konfiguration des Drucksystems dürfen dies auch Dateien unterschiedlichster Formate sein: Ist Ihr System ordentlich eingerichtet, sollte auch ein

[esser@dual lpr]$ lpr *.jpg test.ps README /var/log/messages

möglich sein. Die zweite und häufig interessantere Anwendungsmöglichkeit ist die, bei der lpr die Standardeingabe stdin liest: So kann lpr das letzte Element einer Shell-Pipe-Kette sein. Ein Beispiel dafür wäre

[esser@dual lpr]$ dvips test.dvi | psselect 1-10 | psnup -2 | lpr

Ein typischeres Beispiel ergibt sich aus der Zusammenarbeit mit einem Office-Paket: Haben Sie (wie oben beschrieben) die Druckausgabe eines Dokumentes in eine Datei (etwa /tmp/out.ps) umgeleitet, so können Sie diverse PostScript-Konverter auf diese Datei anwenden, bevor Sie sie endgültig drucken; am typischsten ist dabei vermutlich die (verkleinerte) Plazierung von zwei Seiten auf einer:

[esser@dual lpr]$ psnup -2 /tmp/out.ps | lpr

In beiden Fällen erwartet lpr keine weiteren Parameter. Die man-page des Tools liefert zwar eine ganze Reihe von Parametern zurück, welche aber größtenteils unwichtig sind - lpr ist noch heute kompatibel zu seinen ersten Unix-Varianten, die sich hauptsächlich mit dem Ausdruck von ASCII-Dateien auf Matrix- oder Typenraddruckern beschäftigten… Wichtig ist aber häufig die Option "-P", über die die Warteschlange ausgewählt werden kann.

Warteschlangen

lpr & Co. erwarten prinzipiell, dass Sie angeben, welche Warteschlange Sie bearbeiten möchten, da Sie unter Linux natürlich mehrere Drucker verwalten können; tatsächlich kann es auch mehrere Warteschlangen für einen einzigen Drucker geben, um etwa in unterschiedlicher Qualität zu drucken oder beim Profi-Bürodrucker zwischen Simplex- und Duplex-Druck zu wählen.

Wie heißt mein Drucker?

Ein schneller Blick in die printcap gibt den Überblick, welche Druckerwarteschlangen eingerichtet sind:

[esser@dual lpr]$ cat /etc/printcap | grep ^lp
 lp:\
 lp2:\

In diesem Beispiel heißen die beiden vorhandenen Warteschlangen also "lp" und "lp2".

Der Name der Warteschlange kann den Befehlen über die Option "-P[name]" (z. B. "-Plp" oder "-Plp2") übergeben werden. Wird diese Option nicht verwendet, gehen alle Tools davon aus, dass Sie den "Standard-Printer" verwendet sollen. Welcher das ist, hängt von zwei Bedingungen ab:

  • Falls eine Umgebungsvariable $PRINTER gesetzt ist, enthält diese den Namen des Standard-Druckers.
  • Ist $PRINTER nicht gesetzt, dient der erste Warteschlangeneintrag in der /etc/printcap als Standard.

Was kommt dann? lpq

Eine Übersicht über den aktuellen Inhalt der Warteschlange gibt es jederzeit mit dem Kommando lpq (bzw. lpq -Pname); hier werden alle Druck-Jobs in der Reihenfolge angezeigt, in der sie an den Drucker geschickt werden (Abbildung 2). Wichtig ist dabei die Job-Nummer, denn über diese können Sie einen Job auch wieder abbrechen, ohne dafür die restlichen Druckaufträge auch zu stoppen. Im Mehrbenutzerbetrieb ist auch die Spalte Owner von Wert, denn über diese erfahren Sie sofort, welcher Kollege oder Mitbewohner den Drucker über Stunden mit Handbuch-Ausdrucken quält. "lpq" steht übrigens für "line printer queue".

Abbildung 2

Abbildung 2: lpq zeigt die Druckaufträge an

lprm

Wurde eine Datei zu früh an den Drucker geschickt, kann ein Job jederzeit wieder aus der Druckerwarteschlange entfernt werden - das gilt sogar dann, wenn er sich bereits im Ausdruck befindet. Alles, was dazu benötigt wird, ist die Druckjob-Nummer; sollte der Druckauftrag nicht in der Standard-Warteschlange liegen, ist auch noch der Warteschlangen-Name anzugeben:

[esser@dual lpr]$ lprm -Plp2 42

Dabei darf jeder Benutzer übrigens nur die Jobs löschen, die er auch selbst in Auftrag gegeben hat. Um alle eigenen Jobs zu löschen, kann man auch kurz "lprm -" eingeben. Besondere Privilegien hat wie üblich root: Der Administrator kann beliebige Jobs aus der Queue nehmen, und hier führt ein "lprm -" zum Löschen wirklich sämtlicher Einträge.

Je nach Drucksystem führt der lprm-Befehl nicht immer zum gewünschten Resultat. Im Test mit CUPS liefen Druckjobs teilweise unbeirrbar weiter, obwohl auch das CUPS-Anwenderhandbuch den Abbruch über lprm (oder wahlweise cancel) empfiehlt.

lp control

Bei der Drucker-Kontrolle gehen die verschiedenen Drucksysteme getrennte Wege. Zwar bietet auch CUPS eine Version des klassischen lpc-Kommandos (line printer control), diese erlaubt aber nur eine Statusabfrage.

Worum geht es überhaupt: Die Kontroll-Tools gestatten im Wesentlichen vier Funktionen: Das (De-) Aktivieren des Druckbetriebs (also Anhalten und Wieder-Anwerfen des Druckers) und die Sperrung und Freigabe der Druckerwarteschlange. Der Unterschied ist schnell erklärt: Eine gesperrte Warteschlange verweigert die Annahme neuer Druckjobs, während eine inaktive Warteschlange zwar neue annimmt aber nicht weiter druckt.

Das klassische Drucksystem, LPR (heute oft LPRold genannt), verwendet den lpc-Befehl (/usr/sbin/lpc) für diese Aufgaben; die vier beschrieben Funktionen erreichen Sie dort über Befehle der Form

/usr/sbin/lpc stop name
 /usr/sbin/lpc start name
 /usr/sbin/lpc disable name
 /usr/sbin/lpc enable name

Bei CUPS kennt lpc nur das eher langweilige stat-Kommando; es ist wohl nur vorhanden, um Programme lauffähig zu halten, die die Existenz eines lpc-Befehls voraussetzen, ohne ihn wirklich zu verwenden. Die gleichen vier Funktionen erreichen Sie bei CUPS über die Befehle

disable name
 /usr/bin/enable name
 reject name
 accept name

Vorsicht: Die Programme haben nicht die erwartete Funktion! disable und enable entsprechen nicht den gleichnamigen Optionen des lpc-Kommandos. Zudem muss das Kommando enable mit vollem Pfad aufgerufen werden, da die Bash einen eingebauten Befehl gleichen Namens besitzt, der bei Weglassen des Pfads vorrangig wäre. Der Bash-enable-Befehl verwaltet die übrigen in die Bash integrierten Befehle (wie z. B. exit oder set); siehe man bash.

Während ein "echter" lpc auf LPR-Systemen nur vom Administrator root ausgeführt werden kann, dürfen die entsprechenden CUPS-Kommandos von jedem aufgerufen werden; sie verlangen beim Start durch normale Anwender jedoch die Eingabe des root-Passworts, das spart den su-Aufruf.

Dokumentation

Die Linux-Kommandozeilen-Tools bieten oft einen ungeahnten Reichtum an Optionen, die abwechselnd in die Kategorien "nützliche Geheimtipps" oder "obskure Sonderfunktionen" passen; wie üblich empfehlen wir einen Blick in die man-Pages - die Grundfunktionen haben Sie nun kennen gelernt. Viel Spaß beim Experimentieren.

Glossar

Warteschlange

Traditionell wird eine Datei gedruckt, indem ihr Inhalt einfach über die Druckerschnittstelle (in der Regel ein Parallelport) ausgegeben wird; unter MS-DOS war das auch genau die Vorgehensweise. Linux ist aber ein echtes Multi-User-Multi-Tasking-Betriebssystem, d. h. es muss damit rechnen, dass mehrere Benutzer aus verschiedenen Programmen heraus gleichzeitig drucken wollen. Würden nun alle Prozesse einfach auf die parallele Schnittstelle schreiben, würde ein Chaos entstehen. Daher haben unter Linux normale Anwender keine Schreibrechte für die Parallelports (/dev/lp*), sondern müssen ihre Druckaufträge mit dem Hilfsprogramm lpr in eine Warteschlange einreihen. Das Drucksystem legt die Jobs in einem Unterverzeichnis von /var/spool/ (oft /var/spool/lpd/ oder bei CUPS /var/spool/cups/) ab und bearbeitet sie der Reihe nach.

Tip a friend    Druckansicht beenden Bookmark and Share
Kommentare