Mehrere Drucker, printserv-Prozesse und semaphore-Problem

thimo

Neuer User
Mitglied seit
9 Jul 2009
Beiträge
9
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich habe einen Patch für die Nutzung von mehreren USB-Druckern geschrieben. Für jeden Drucker wird ein eigener printserv-Prozess unter einem separaten Port gestartet. Der Druck funktioniert nun auf allen Druckern ohne Probleme.

Entferne ich jetzt jedoch irgendeinen Drucker (der entsprechende printserv-Prozess wird damit beendet) und starte einen Druckauftrag auf einem der verbliebenen Geräte (egal welches), erhalte ich folgende Fehler und der entsprechende printserv-Prozess wird beendet:

Jul 18 10:43:40 printserv[2639]: Waiting for incoming print job ...
Jul 18 10:43:40 printserv[2639]: Data connection from 192.168.0.33 port -20265 accepted.
Jul 18 10:43:40 printserv[2639]: Sem wait in status server failed (errno=36).
Jul 18 10:43:40 printserv[2639]: Waiting 5 s instead.
Jul 18 10:43:45 printserv[2637]: Sem post failed (errno=1802292).
Jul 18 10:43:45 printserv[2637]: Status server stopped due to error.
Jul 18 10:43:45 printserv[2636]: Detaching semaphore failed (Errno: 36)
Jul 18 10:43:45 printserv[2636]: Printserver is down.

Stecke ich den eben entfernten Drucker wieder an (es wird also ein neuer printserv-Prozess gestartet), läuft dieser Drucker wieder problemlos. Bei allen anderen Druckern bleibt der Fehler bestehen, bis auch hier ein neuer printserv-Prozess durch Abziehen und Wiederanstecken erfolgt. Dann funktionieren alle Drucker wieder einwandfrei.

Zusammengefasst:
- Starte ich mehrere printserv-Prozesse, laufen diese einwandfrei.
- Beende ich davon einen beliebigen Prozess, verabschieden sich die verbliebenen Prozesse bei einem Druckauftrag mit einem semaphore-Fehler.

Jemand eine Idee?
Gibt es zum printserv-Programm eventuell Quelltexte?
 
Hi.
Du könntest dir die Prozesse mal noch mit strace ansehen. Ich wüßte nicht, dass wir dazu Quellen haben. Die Anwendung hat AVM bestimmt selbst geschrieben.

MfG Oliver
 
Ok, das habe ich mal getan.

Printserv startet insgesamt vier Prozesse, die anscheinend über einen gemeinsamen Speicherbereich untereinander kommunizieren.

Wird printserv eine weiteres mal gestartet, verbinden sich diese Prozesse wahrscheinlich über genau den selben Speicherbereich. Beende ich jetzt eine printserv-Anwendung auf normalem Weg (kill -TERM), gibt diese den Speicher wohl wieder frei und alle anderen Prozesse haben ein Problem.

Abhilfe schafft ein "kill -KILL", dann läuft alles einwandfrei weiter. Ich könnte mir aber vorstellen, dass dieses Vorgehen früher oder später zu Speicherproblemen führt. Mal sehen...

Ich stelle den Patch dann hier mal zur Verfügung.
 
Patch: FritzBox als Printserver für mehrere Drucker

FritzBox als Printserver für mehrere Drucker

Dieser Patch baut auf der Idee aus diesem Beitrag auf, angeschlossene Drucker und den jeweiligen Printserver-Port mittels des physikalischen USB-Ports aneinander zu koppeln. Damit ist eine feste Zuordnung gewährleistet.

Da der AVM-Printserver jeweils zwei Ports belegt (n+1), wird immer ein Port übersprungen:
phys. USB-Port 0 => Port 9100
phys. USB-Port 1 => Port 9102
phys. USB-Port 2 => Port 9104
...

Alle Drucker sollten an dem gleichen USB-Hub angeschlossen werden. Prinzipiell sind mit Einschränkungen aber auch unterschiedliche Hubs möglich.

In der Übersicht "USB-Geräte" werden alle angeschlossenen Drucker mit den vergebenen Printserver-Ports aufgelistet.

Der Drucker am phys. USB-Port 0 (Port 9100) wird zudem - sofern angeschlossen - immer als Standard-Drucker (Device-Node /dev/usblp0) registriert. Das macht spätestens dann Sinn, wenn die Fritz Box mal eigene Druckfunktionen (wie z.B. einen direkten Faxausdruck) mitbringen sollte.

Einschränkungen:
Der dargestellte Druckerstatus wechselt beliebig zwischen den angeschlossenen Druckern.

Installation:
Angehängte Datei in 275-multiple_printers.patch umbenennen und in das Verzeichnis freetz/patches kopieren.

Getestet auf einer 7270 mit Firmware 54.04.76 [de].


[EDIT] Patch hinsichtlich Coding Conventions überarbeitet
Eine Integration in Freetz müsste wohl irgendwie so aussehen:
Code:
config FREETZ_MULTIPLE_PRINTERS
	bool "Add support for multiple printers"
	depends on FREETZ_HAS_USB_HOST && FREETZ_TYPE_LANG_DE
	default n
	help
		Use this patch if you want to use more than one printer
 

Anhänge

  • 275-multiple_printers.patch.txt
    4.6 KB · Aufrufe: 92
Zuletzt bearbeitet:
Finde ich ganz interessant, da ich an meiner 7141 zwei Drucker habe, die benutze ich aber selten gleichzeitig, also mal schauen ;)
Ich würde mich aber vielleicht über ein paar Screenshots freuen, da du ja auch viele Eingriffe in WEBIF gemacht hast.

Danke, Matze
 
Am Web-Interface wurden nur zwei Zeilen in der Datei usr/www/avm/html/de/usb/status.js geändert:

1. Variable Tabellenbreite, damit der Port bei längeren Druckernamen auch wirklich sichtbar ist.
-.tAura {width: 690px; table-layout: fixed}
+.tAura {width: 690px; table-layout: auto}

2. Konvertierung von Tabs im Druckernamen in Zeilenumbrüche
-str += name;
+str += name.replace(/^\s+|\s+$/g, "").replace(/\t/g, "<br />");

Das war es auch schon.
 

Anhänge

  • multiple_printers.jpg
    multiple_printers.jpg
    29.9 KB · Aufrufe: 90
ahhh, ok, danke dir.
Werde ich die Tage vielleicht mal ausprobieren, wenn die Zeit da ist.
 
Mdev?

The patch is written for the AVM hotplug chain.
Would it be a good idea to add this functionality also to the MDEV hotplug chain?
 
Habe ein 7141 mit freetz: Firmware: 40.04.57freetz-1.0. laufen.
Ich bin an diesem patch "multiple printers" interessiert. Gibt es eine Möglichkeit
diesen patch OHNE Neukompilation einzubringen.

THX
 
Theoretisch ja. Du müsstest die gepachte Version der /etc/hotplug/printer mit "mount -o bind ..." überschreiben...

MfG Oliver
 
Super schnelle Reaktion von oli.

Allerdings benötige noch ein paar Gehstützen.
Wie bekomme ich den besagten patch in /etc/hotplug/printer?
Einfach durch append? Wo wie ist dan zu mounten?
Einfach in der shell eingeben?

Typische newbie Fragen!.
Sorry
 
ich hoffe ich bin im richtigen thread gelandet und schildere mein problemchen mal:
ausgangssituation:
alte fb7170 aus dem schrank gekramt
usb-drucker sind en "kyo fs-1010" laser und en "epson dx7450" multi-tintenstrahler.
freetz drauf mit default, kiste als wds repeater eingerichtet und jeder der beiden drucker lässt sich am usb port ansprechen.
der epson taucht unter geräte zwar nicht auf aber unter ubuntu mit app/HP Ldirect socket://ip:9100 druckt er trotzdem!
der kyo wird auch im webif angezeigt und läuft ebenfalls mit den einstellungen.
der epson im webif wird angezeigt als: USB2.0 MFP

dann
freetz drauf mit "multiple printer" patch und "raise usb to 9" patch.
en aktiv hub an usb port und beide drucker an usb1+2 des hubs.
der kyo hängt am port1 und webif sagt usb7:kyo(9100).
der epson is immer noch wech(is halt en gdi drucker).
egal welchen port ich nun auch versuche für den epson einzustellen (9102,4,6,8,10)... nix. er druckt nicht!

auch nicht wenn ich den kyo am port1 abstecke und nur den epson dort anklemme mit 9100 druckt er ebenfalls nix!
dmesg sagt:
AR7WDT: System Init UEberwachung abgeschlossen (198120 ms noch verfuegbar)
Vendor: EPSON Model: Stylus Storage Rev: 1.00
Type: Direct-Access ANSI SCSI revision: 02

der drucker wird als storage erkannt aber was wie gesagt keine rolle spielt ohne multiple-printer-patch.(da druckt er brav).

fernanschluss is inaktiv!

dirty lösung imho hier is halt den multiple patch raus, usb hub und beide drucker dran lassen aber eben immer nur einen der beiden einschalten.

gibts da noch en trick/lösung?
irgendwelche ideen?
thx
Al
 
Zuletzt bearbeitet:
Hatte ähnliches Problem: Lösung bei mir war simpel, nämlich, dass die angeschlossenen Geräte in der Summe (bei mir allerdings 1 externe USB-HD, Scanner und 3 Drucker) zu viel Strom gezogen haben. Den USB-Hub hab ich einfach durch einen aktiven mit externer Stromversorgung ersetzt und dann ging's. Evtl. ziehen bei dir die beiden Drucker schon zu viel Strom?
 
Viel los ist in diesem Thread ja nicht. Entweder funktionieren die Multiple Printers bei allen Leuten super (außer bei mir) oder es nutzt keiner. ;)

Ich habe den Patch gestern in einer neu gebauten Firmware für mein Speedport W920V (Fritzbox 7570) aktiviert und anfangs lief auch alles supi. Heute wunderte ich mich aber darüber, dass die Drucker plötzlich vertauscht waren: Obwohl unter den USB-Geräten der Drucker USB2 als dem Port 9004 und der Drucker USB3 als dem Port 9006 zugewiesen angezeigt werden (siehe Bildchen), gehen die Druckaufträge an Drucker USB2 auf den Port 9006 und die an Drucker USB3 plötzlich an Port 9004. Die Drucker stecken aber unverändert in den selben Ports des (mit Fremdstrom versorgten) USB-Hubs. Als ich dann den Drucker USB2 mal abgezogen habe, rebootete die ganze Box schlagartig. Also normal ist das nicht. Seit diesem Reboot läuft wieder alles einwandfrei und die Drucker sind wieder den richtigen Ports zugeordnet. Fragt sich nur wie lange. Und es ist auch nicht tolerierbar, dass Druckaufträge an falsche Drucker gesendet werden, da die Drucker in einer anderen Etage stehen und falsche Druckaufträge wegen falscher Codierung der Druckdaten zu Unmengen an Papierverbrauch führen können, da sie nicht ständig beaufsichtigt sind.

Hat jemand ne Idee, woran das Problem liegen und ob es behoben werden kann? Informationshalber schicke ich mal das File /etc/hotplug/printer aus meiner Box mit... 'N bisschen seltsam sieht das schon aus. Ich bin nicht der große Crack bezüglich Fritzbox Shell-Scripts, aber was haben am Ende "esac" und "vrijgeven" da zu suchen? :confused:

Danke und viele Grüße, Volker
 

Anhänge

  • etc_hotplug_printer.txt
    5.6 KB · Aufrufe: 22
  • USB Printers.png
    USB Printers.png
    56.1 KB · Aufrufe: 9
Zuletzt bearbeitet:
Das Skript wird schon syntaktisch in Ordnung sein, sonst würde es gar nicht funktionieren. "esac" ist das Ende von "case", "vrijgeven" heißt freigeben, das Gegenstück zu "passeeren". Wenn Du die Begriffe in Google eingibst, sieht Du auch, wo sie herkommen.

Wenn die Box unter USB2 plötzlich den anderen Drucker sieht, wird das Skript diesen dann auch so zuweisen. Um dem nachzugehen, bräuchte man genauere Informationen von dem Fall, wo es aufgetreten ist, also Kernel Log und Ausgabe von lsusb.
 
Danke für die Erklärung! Höchst ungewöhnlich, dass da niederländische Funktionsnamen benutzt werden. Und die Syntax der Shell-Scripte ist wirklich immer wieder höchst gewöhnungsbedürftig, weil sie sich an keine der gängigen Sprachen anlehnt. Verstehen tu ich es nicht: Ne Funktion passeeren mag ich ja mit viel Fantasie noch finden (auch wenn mir nicht klar ist, wie deren Ende gekennzeichnet ist), aber ne Funktion vrijgeven finde ich nicht. Ich gehe mal davon aus, dass das Wort vrijgeven am Ende des Scripts den Funktionsaufruf darstellt? Ich weiß nicht, ob jemand Lust hat, das zu erklären. Wenn nicht, ist auch egal. ;-)

Bisher ist die Druckerverwechslung nicht nochmal aufgetreten, aber ich beobachte es weiter. Wenn es nochmal auftritt, werde ich lsusb ausführen und die Ausgabe posten (danke für den Hinweis). Die Frage ist auch, ob die nötigen Information aufgrund des begrenzten Speichers im Kernel Log noch enthalten sind.
 
Zuletzt bearbeitet:
Danke für die Erklärung! Höchst ungewöhnlich, dass da niederländische Funktionsnamen benutzt werden.
Schon der erste Google Treffer für die beiden Wörter zeigt, dass die Namen auf Dijkstra zurückgehen, und der hat eben niederländische Namen bevorzugt.

Je nach Firmware werden beide Funktionen zum Beispiel in /etc/hotplug/rc.usbsema definiert. Diese Datei wird vorher im Skript eingelesen. Wenn Du Dich für Shell Skript interessierst, gibt es sicher ausführliche Beschreibungen dazu, und wenn nicht, hat es auch wenig Sinn, hier viel dazu zu schreiben
 
Schon der erste Google Treffer für die beiden Wörter zeigt, dass die Namen auf Dijkstra zurückgehen, und der hat eben niederländische Namen bevorzugt.
Ähm, naja, 1965. ;-) Mag sein, dass das mal am Rande in der Prozessinformatik-Vorlesung zur Sprache kam, aber im Code waren mir diese ausgeschriebenen holländischen Bezeichnungen für Semaphoren noch nie zuvor untergekommen. Deshalb hat es mich verwirrt und ich dachte zuerst an einen Fehler oder an einen durch Patchen reingerutschten Kommentar. Ich finde es recht gewagt, in einem international verwendeten Open-Source oder GPL-Projekt andere Bezeichnungen als englische zu verwenden. Es gehört zum guten Ton, dass ordentliche Software lesbar und ohne zu Raten selbsterklärend sein sollte. Auch wenn der Erfinder eines bestimmten Konzepts nun Holländer war. Man verwendet ja auch keine deutschen Wörter in der EDV, nur weil der Erfinder des programmgesteuerten Rechners Zuse hieß. ;-)

Egal, ist Off Topic, dient aber der Erklärung, wie ich auf diese Frage kam.

Je nach Firmware werden beide Funktionen zum Beispiel in /etc/hotplug/rc.usbsema definiert. Diese Datei wird vorher im Skript eingelesen.
Danke, das hat als Erklärung gereicht. Ich habs jetzt verstanden. Mir war auch vollkommen neu, dass man im Shell-Script mit "# includes" einbetten kann. Bisher dachte ich, dass das nur mit "source" geht und es sich bei "# includes" lediglich um einen Kommentar handelt. Auf der Fritzbox ist offenbar alles etwas anders. Tiefer einarbeiten lohnt sich für mich nicht, weil ich es zu selten nutze und eh wieder vergessen würde. Hier bleibe ich nur ein interessierter Anwender. Normalerweise kam ich bisher mit meinem Wissen auch hin. Aber dieses holländisch und diese eigenwillige Script-Syntax hat mich ziemlich irritiert. Sowas habe ich noch nie zuvor irgendwo gesehen. :cool:
 
Zuletzt bearbeitet:
So, das ging ja ruckizucki. Der Fehler mit der Druckerverwechslung tritt gerade wieder auf, nachdem ich den Router neu gestartet hatte, weil er im Sekundentakt mein Mobilfunkgerät vom WLAN getrennt hat. Das ist offenbar ein weiterer Fehler von Freetz, der aber nicht in diesen Thread gehört. Ich tendiere daher derzeit dazu, Freetz wieder den Rücken zu kehren und auf speed2fritz zurückzusatteln. Da gab es solche Fehler nicht. Aber leider auch nur einen Druckerport.

Ich habe das kernel logfile angehängt.

Der Druckerstatus zeigt an: "Allgemeiner Fehler" (/var/log/printer_status: 3). Trotzdem sind beide Drucker online und man kann drucken - nur leider verkehrt herum. In der Zeit, während ich diese Message schrieb, wechselte dann der Inhalt von /var/log/printer_status auf 0 und in der Fritzbox-Oberfläche wurde "Bereit" angezeigt. Trotzdem waren die Drucker nach wie vor falsch zugeordnet. D.h. das Script muss offenbar danach nochmal gelaufen sein oder es schreibt auch noch jemand anderes in das File /var/log/printer_status. Komisch ist auch, dass in /var/log/printer_status anfangs eine 3 stand, obwohl das Script /etc/hotplug/printer gar keine 3 in dieses File ausgeben kann. Das deutet darauf hin, dass da noch jemand anderes rein schreibt. Vielleicht irgendein anderes Fritzbox-Script?

Hier die anderen Infos:

Code:
root@fritz:/var/mod/root# cat /var/log/printer_id
:       004: Canon BJC-3000 (Port 9106) 003: USB USB2.0-Print  (Port 9104)

root@fritz:/var/mod/root# cat /var/log/printer_status
3

root@fritz:/var/mod/root# lsusb
BUS=001
DEV=001
VID=0000
PID=0000
CLS=09
SCL=00
SPEED='hi'
VER='2.0'
ISOC=0
INUM=1
ICLS1=09
ISCL1=00

BUS=001
DEV=002
VID=0409
PID=005a
CLS=09
SCL=00
SPEED='hi'
VER='2.0'
ISOC=0
INUM=1
ICLS1=09
ISCL1=00

BUS=001
DEV=003
VID=1a86
PID=7584
CLS=00
SCL=00
SPEED='full'
VER='1.1'
ISOC=0
INUM=1
ICLS1=07
ISCL1=01

BUS=001
DEV=004
VID=04a9
PID=1051
CLS=00
SCL=00
SPEED='full'
VER='1.1'
ISOC=0
INUM=1
ICLS1=07
ISCL1=01

root@fritz:/etc/hotplug# cat /proc/bus/usb/devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=0000 ProdID=0000 Rev= 2.06
S:  Manufacturer=Linux 2.6.19.2 musb-hcd
S:  Product=MUSB HDRC host driver
S:  SerialNumber=musb_hdrc
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480 MxCh= 4
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=0409 ProdID=005a Rev= 1.00
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=02 Prnt=02 Port=02 Cnt=01 Dev#=  3 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=1a86 ProdID=7584 Rev= 2.54
S:  Product=USB2.0-Print
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr= 96mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usblp
E:  Ad=82(I) Atr=02(Bulk) MxPS=  32 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS=  32 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=04a9 ProdID=1051 Rev= 1.00
S:  Manufacturer=Canon
S:  Product=BJC-3000
S:  SerialNumber=67H9gp
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr=  2mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usblp
E:  Ad=01(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
root@fritz:/etc/hotplug#

Es deutet nach außen alles darauf hin, dass die Drucker von der Box korrekt erkannt und registriert wurden. /proc/bus/usb/devices, aus dem sich das Script die nötigen Infos holt, ist auch okay. VID=1a86 PID=7584 an USB2 ist der Logilink USB-Parallel-Adapter und VID=04a9 PID=1051 an USB3 ist der BJC-3000. Genauso wie es auch in der Oberfläche angezeigt wird. Trotzdem gehen Druckaufträge an Port 9106 auf den USB-Parallel-Adapter und umgekehrt.

Nachdem ich den Router neu gestartet hatte, stimmte die Zuordnung der Drucker wieder. Also ist es offenbar reiner Zufall, ob sie stimmt oder nicht. Die Protokolle sahen nach dem Neustart genauso aus wie zuvor, mit einer einzigen Ausnahme:

Code:
root@fritz:/var/mod/root# cat /var/log/printer_id
:       003: USB USB2.0-Print  (Port 9104)      004: Canon BJC-3000 (Port 9106)

Im Grunde ist das natürlich auch richtig, aber es fällt auf, dass die Reihenfolge der Drucker hier anders ist als oben. Vielleicht ist das ein Hinweis auf das Problem...

Jetzt bin ich gespannt auf die Antwort. ;-)
 

Anhänge

  • var_log_messages.txt
    48.3 KB · Aufrufe: 2
Zuletzt bearbeitet:
Ich hab deine Beiträge jetzt mehrmals gelesen. Aber ganz dahinter gekommen bin ich noch nicht...

1. Wenn du die Box neu startest, funktionieren die Drucker nach dem Neustart korrekt?
2. Ist die Zuordnung nach einem Neustart immer gleich oder kann es da auch schon vorkommen, dass die Drucker nicht immer die gleiche id haben?
3. Nach einer Weile sind die Zuordnungen dann vertauscht? Kannst du das im Webinterface, in cat /proc/bus/usb/devices oder in der /var/log/printer_id an einer Änderung festmachen? Muss ja irgendwo ersichtlich sein, dass sich die Zuordnung verändert hat?

Gruß
Oliver
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.