# 1.107.2

# Verwaltung von Druckern und Druckerwarteschlangen

Beschreibung: Prüfungskandidaten sollten in der Lage sein, Druckerwarteschlangen und Druckjobs von Benutzern zu verwalten. Dieses Lernziel beinhaltet die Kontrolle von Druckservern und Druckerwarteschlangen und das Lösen allgemeiner Druckprobleme.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- lpc
- lpq
- lprm
- lpr
- `/etc/printcap`

Drucken unter Linux läuft immer nach einem ganz bestimmten Schema ab. Zunächst einmal geht es in diesem Abschnitt um die Verwaltung von Druckerwarteschlangen. Die Einrichtung verschiedener Drucker wird in den folgenden Kapiteln erläutert.

### Druckerwarteschlangen - Das Prinzip

Druckerwarteschlangen arbeiten unter Unix nach einem feststehenden Prinzip, nach dem auch alle anderen Systeme mit Warteschlangen arbeiten. Es gibt viele völlig unterschiedliche Subsysteme, die dieses Prinzip benutzen, so etwa das at-System oder das Fax-System. Das zugrundeliegende Prinzip ist einfach zu durchschauen, aber sehr funktional.

Eine Warteschlange (engl. spool) ist immer ein Verzeichnis irgendwo unter `/var/spool`. In dieses Verzeichnis werden die Druckaufträge in zwei verschiedenen Dateien abgelegt. Die erste Datei trägt einen Namen, der mit `cf` beginnt, diese Datei enthält die Kontrollinformationen des Jobs. (`cf` - control file). Kontrollinformationen sind z.B. der Name der zu druckenden Datei, der Name des Users, der den Druckauftrag aufgegeben hat und der Hostname des Rechners, von dem aus der Auftrag abgegeben wurde. Die zweite Datei trägt einen Namen, der mit den Buchstaben `df` beginnt und enthält die zu druckende Datei selbst (`df` - data file).

Wird also ein Druckauftrag abgegeben, so werden eigentlich nur diese zwei Dateien erstellt. Das eigentliche Drucken wird dann von einem Daemon-Prozeß erledigt, der diese Warteschlange abarbeitet. So können auch Aufträge abgeschickt werden, wenn der Drucker gerade nicht zur Verfügung steht. Denn sie werden ja nur in das Spool-Verzeichnis geschrieben. Selbst wenn der Rechner danach ausgeschaltet wird, sind die Aufträge nicht verschwunden. Sobald der Druckerdaemon das nächste Mal läuft und der Drucker zur Verfügung steht, wird die zu druckende Datei dann ausgedruckt.

### Definition von Druckerwarteschlangen in /etc/printcap

Jeder Drucker, der dem System bekannt ist, also auch Netzwerkdrucker auf anderen Rechnern, erhält einen Eintrag in der Datei `/etc/printcap`. Dieser Eintrag wird im Abschnitt 1.107.4 genauer erklärt. Hier interessieren uns jetzt nur zwei Kleinigkeiten dieses Eintrags.

Ein Eintrag in `/etc/printcap` enthält - neben anderen Informationen - den Namen des zu verwendenden Druckers und die Angabe, welches Verzeichnis das zu verwendende Spoolverzeichnis ist. Zum Beispiel zeigt der folgender Eintrag einen Drucker:

      lp|hplaser|PS;r=600x600;q=medium;c=gray;p=a4;m=auto:\
        :sd=/var/spool/lpd/lp:\
        :lf=/var/spool/lpd/lp/log:\
        :af=/var/spool/lpd/lp/acct:\
        :if=/etc/apsfilter/basedir/bin/apsfilter:\
        :lp=/dev/lp0:\
        :sh:\
        :mx#0:

Die für uns interessanten Einträge sind hier:

lp|hplaser
  Diese beiden Werte sind die Namen des Druckers, unter denen er angesprochen werden kann. Der Name `lp` hat eine Sonderbedeutung. Der Drucker, der diesen Namen trägt ist der Standard-Drucker, an den alle Aufträge geschickt werden, die keine expliziten Angaben über einen zu verwendeten Drucker machen.
sd=/var/spool/lpd/lp
  Der `sd`-Eintrag bezeichnet das Spoolverzeichnis (`sd` - spool directory) in das die Aufträge abgelegt werden sollen.

Mit Hilfe dieser Information weiß das Drucksystem von Linux also, daß der Drucker `lp` oder `hplaser` das Spoolverzeichnis `/var/spool/lpd/lp` benutzt. Wenn also ein Druckauftrag an diesen Drucker abgeschickt wird, dann werden sowohl die Kontrolldatei, als auch die zu druckende Datei in diesem Verzeichnis abgelegt.

### Befehle für den Umgang mit Druckerwarteschlangen

Zum Umgang mit den Druckerwarteschlangen stehen uns verschiedene Befehle zur Verfügung, die in dieser Form auch wieder sehr typisch für alle Unix/Linux Warteschlangensysteme sind. Diese Befehle werden im Folgenden kurz beschrieben:

#### Druckaufträge losschicken

Um einen Druckauftrag loszuschicken, wird der Befehl lpr benutzt. lpr wird entweder ein Dateinamen mitgegeben, um eine bestimmte Datei zu drucken, oder - falls kein Dateinamen angegeben wurde - druckt lpr seine Standard-Eingabe.

Der Name des zu verwendenden Druckers kann mit der Option `-P` angegeben werden. Wird kein Name angegeben, so wird standardmäßig der Drucker mit dem Namen `lp` benutzt.

Die Anzahl der zu druckenden Kopien kann mit der Option `-#` angegeben werden. Vorsicht bei der Anwendung dieses Parameters auf der Shell. Die Shell mißinterpretiert das #-Zeichen als Kommentarzeichen, es muß also vor Interpretation geschützt werden (`-\#`).

Um also die Datei `/etc/passwd` auf dem Drucker `lp2` vier mal auszudrucken, wird der Befehl

      lpr -Plp2 -\#4 /etc/passwd

angegeben. Soll die Datei nur einmal auf dem Standarddrucker ausgegeben werden, so genügt ein

      lpr /etc/passwd

Der Befehl lpr druckt nicht wirklich, sondern legt die Aufträge nur in die entsprechenden Spool-Verzeichnisse ab. Erst der Druckerdaemon lpd erledigt das Drucken selbst.

#### Inhalt der Warteschlange anzeigen

Um den Inhalt einer Druckerwarteschlange anzuzeigen, existiert der Befehl lpq. Er zeigt die aufgegebenen Druckaufträge für einen mit `-P` angegebenen Drucker oder - falls der Druckername weggelassen wurde - für den Standarddrucker.

Die Druckaufträge werden zusammen mit einer Jobnummer ausgegeben, die wir später brauchen werden, um einzelne Aufträge wieder zu löschen. Die Ausgabe des Befehl könnte etwa so aussehen:

      lp is ready and printing
      Rank   Owner      Job  Files                             Total Size
      active root       447  /etc/passwd                       1204 bytes

Wir entnehmen also daraus, daß nur ein Druckauftrag vorliegt, der dem User `root` gehört, also von ihm aufgegeben wurde. Der Auftrag hat die JobID 447 und druckt die Datei `/etc/passwd`, die insgesamt 1204 Byte groß ist.

Die erste Zeile ist für die Diagnose von Fehlern sehr wichtig. Sie zeigt den Status des Druckerdaemons an. Es könnten hier auch Fehlermeldungen wie

      Warning: lp is down:
      Warning: lp queue is turned off

ausgegeben werden, wenn der Drucker deaktiviert wurde oder einfach eine Leerzeile, wenn kein Druckerdaemon vorhanden ist.

#### Druckaufträge aus der Warteschlange löschen

Um einzelne Druckaufträge wieder aus einer Warteschlange zu löschen, gibt es den Befehl lprm. Auch er kennt den Parameter `-P`, mit dem der gewünschte Druckername angegeben werden kann und auch er bezieht sich auf den Standarddrucker, wenn dieser Parameter weggelassen wurde.

lprm erwartet die Angabe einer oder mehrerer JobIDs als Parameter, die die zu löschenden Jobs beschreiben. Diese JobIDs können vor dem Aufruf von lprm durch lpq festgestellt werden.

### Drucker kontrollieren

Um verschiedene Drucker zu kontrollieren, existiert das Printer-Control-Program lpc. Dieses Programm kann verschiedene Befehle verstehen, die entweder auf der Kommandozeile eingegeben werden, oder an einen Interpreter weitergegeben werden, wenn lpc ohne Parameter aufgerufen wurde.

Für jeden Drucker, der in `/etc/printcap` angegeben wurde, kann lpc benutzt werden um

- den Drucker zu aktivieren oder zu deaktivieren,
- die Warteschlange des Druckers zu aktivieren oder zu deaktivieren,
- die Reihenfolge der Druckjobs in der Warteschlange zu ändern,
- den Status der Drucker, ihrer Warteschlangen und ihrer Daemonen zu erfragen.

Wird lpc ohne Parameter aufgerufen, so wartet er auf Kommandos von der Standard-Eingabe. Sind Parameter angegeben, so interpretiert lpc den ersten Parameter als Kommando und die folgenden Parameter als Argumente dieses Kommandos. lpc kennt folgende Kommandos:

? [Kommando]
help [Kommando]
  Gibt eine kurze Hilfsmeldung über das Kommando aus. Wurde kein Kommando angegeben, so gibt der Befehl eine Liste aller verstandenen Kommandos aus.
abort all | Drucker
  Beendet einen aktiven Druckerdaemon und verunmöglicht die Angabe weiterer Druckaufträge. Entweder gilt dieser Befehl für alle (all) oder für den angegebenen Drucker.
clean all | Drucker
  Alle Temporärdateien, Daten- oder Control-Dateien von Aufträgen, die nicht ausgeführt werden konnten, werden gelöscht. Entweder gilt dieser Befehl für alle (all) oder für den angegebenen Drucker.
disable all | Drucker
  Schaltet die Warteschlange ab. Das verunmöglicht die Angabe weiterer Druckjobs durch lpr. Entweder gilt dieser Befehl für alle (all) oder für den angegebenen Drucker.
down all | Drucker Nachricht
  Schaltet die Warteschlange ab und schreibt die angegebene Nachricht in die Status-Datei des Druckers (oder aller Drucker). Die Statusmeldung wird dann den Usern angezeigt, die einen Druckauftrag abgeben wollen.
enable all | Drucker
  Schaltet eine Warteschlange wieder an. Damit ist es wieder möglich, Druckaufträge mit lpr an den entsprechenden Drucker zu schicken.
restart all | Drucker
  Startet für den angegebenen Drucker (oder alle Drucker) einen neuen Druckerdaemon. Ein eventuell vorher vorhandener Daemon wird vor dem Neustart abgebrochen (wenn der root-User den Befehl aufgibt).
start all | Drucker
  Ermöglicht das Drucken und startet den Druckerdaemon für den angegebenen Drucker (oder alle).
status all | Drucker
  Zeigt den Status des angegebenen Druckers (oder aller Drucker).
stop all | Drucker
  Hält den Druckerdaemon an, nachdem der aktuelle Auftrag abgearbeitet wurde und verunmöglicht die Aufgabe weiterer Aufträge.
topq Drucker Jobids
  Verschiebt die JobIDs in der angegebenen Reihenfolge an den Anfang der Warteschlange.
up all | Drucker
  Ermöglicht alles und startet einen neuen Druckerdaemon. Das Gegenteil von down.

All diese Befehle können entweder als Kommandozeilenparameter eingegeben werden, wie etwa

      lpq up all

oder - wenn lpc ohne Parameter aufgerufen wurde - als Befehl von der Standard-Eingabe:

      lpc
      lpc> up lp
      lp:
            printing enabled
            daemon started
      lpc> exit

Wurde lpq ohne Parameter aufgerufen, so kann der Interpreter über die Befehle `exit` oder `quit` wieder verlassen werden.