Beheben von Timeout-Fehlern bei Postscript-Druckern
Bei meinem Postscript-Drucker (ein HP Laserjet 2100M) trat folgendes
Problem auf:
Nach dem korrekten Drucken einer Seite blinkte eine Kontroll-LED des
Druckers für einige Zeit, was bedeutete, dass der Drucker noch
auf Daten wartete, obwohl die Seite (oder mehrere) bereits gedruckt
waren.
Nachdem ich im Drucker die Option Postscript-Fehler drucken aktiviert
hatte, warf der Drucker mir nach jedem Druckjob nach einer längeren
Zeit eine Seite mit folgenden Inhalt aus:
ERROR: timeout
OFFENDING COMMAND:timeout
STACK:
Die Lösung hierfür ist recht einfach :
Nach dem Drucken eines Postscript-Dokuments erwartet der Drucker ein
END-OF-JOB Zeichen. Wird dieses nicht zum Drucker gesendet, dann glaubt er
es kommen noch weitere Daten. Wenn über eine längere Zeit aber keine
weiteren Daten kommen, erfolgt natürlich die Timout-Meldung !
Eine korrekte /etc/printcap für den lpd-Druckerdaemon ist:
lp:\
:lp=/dev/lp1:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:
Mit dieser Konfiguration wird keine Titelseite gedruckt (sh), es sind beliebig
grosse Dateien erlaubt (mx) , der Drucker ist an lp1 angeschlossen (lp) und ein
Spoolverzeichnis (sd) ist auch vorhanden.
Jede Postscript-Datei wurde hiermit sofort und ohne Fehler gedruckt.
Der Timeout-Fehler ist aber immer noch vorhanden !
Es ist also notwendig dem Drucker zusätzlich nach jeder gesendeten Postscript-Datei
ein END-OF-JOB zu schicken, damit er weiss, dass der aktuelle Druckjob zu Ende ist.
Das END-OF-JOB Zeichen entspricht dem CRTL-D oder auch 0x04.
Die einfachste Methode, nach jedem Druckjob ein CRTL-D an den Drucker zu schicken
ist die Benutzung eines Input-Filters des Spooling-Systems.
Man braucht nur noch einen Input-Filter einzufügen, der jede Postscript-
Datei 1:1 durchlässt und danach ein CTRL-D anhängt.
Die erweiterte /etc/printcap sieht dann so aus:
lp:\
:lp=/dev/lp1:\
:sd=/var/spool/lpd/lp:\
:if=/var/spool/lpd/lp/ps_eoj:\
:mx#0:\
:sh:
Der Filter ps_eoj ist ein einfaches Shell-Script:
#!/bin/sh
filter_cmd="cat -"
eval $filter_cmd
printf "\004"
exit 0
In diesem Script liest cat von der Standardeingabe und schreibt auf die
Standard-Ausgabe. Anschliessend wird einfach das CRTL-D hinterhergeschrieben.
Mit dieser Lösung arbeitet mein Drucker jetzt korrekt, und erkennt auch
sofort, wann ein Druckjob beendet ist.
Wer noch weitere Fragen zum Drucken mit Postscript-Druckern oder zum lpd-Druckerdaemon
hat, schreibe einfach an std7119@et.fh-osnabrueck.de oder an die LUGO.
Viel Spass beim Drucken...
Martin
[Zurück]