print Befehl hängtgelegentlich

print Befehl hängtgelegentlich

am 12.10.2007 14:29:19 von Lutz Schulze

Hallo,

ich habe hier einen Perl Script unter Linux, der gelegentlich (das passiert
sporadisch nach Stunden oder auch mal nach 2 Tagen) ohne jedes Lebenszeichen
hängt.

Der Script liest in einer Schleife (mit einer Pause zwischen den Abfragen)
mittels TCP über ein IO::Socket Objekt über ein Netzwerk von einem Gerät
einen kurzen String und gibt das Resultat aus.

Ich habe das Problem jetzt schon bis zu folgender Stelle eingekreist:

$messung = <$socket>;
print $messung;

Ich vermutete zuerst, dass das Problem bei der Zeile auftritt. Dem ist aber
nicht so. Wenn ich nur abfrage, aber etwas ganz anderes ausgebe läuft der
Script problemlos durch (zumindest jetzt seit 4 Tagen):

$messung = <$socket>;
print "***";

Testweise habe ich auch $messung vorher initialisiert, falls durch die
Socketabfrage kein Wert zugewiesen wird - kein Erfolg.

Wenn ich testweise die Netzwerkverbindung unterbreche, generiert der Script
eine Fehlermeldung (timeout), das kann es also nicht sein.

Ich vermute nun, dass bei der Abfrage über das Netzwerk sporadisch ein
Zeichen mit in $messung gerät, mit dem print nicht klarkommt.

Ich bin nun nicht der Perl-Experte, deshalb die Fragen: wie könnte man das
weiter eingrenzen (in Datei protokollieren?) oder solche falschen Zeichen
unterdrücken bzw. was könnte print zu derlei Reaktion veranlassen?

Für eure Tips dankt

Lutz

--
Mit unseren Sensoren ist der Administrator informiert, bevor es Probleme im
Serverraum gibt: preiswerte Monitoring Hard- und Software-kostenloses Plugin
auch für Nagios - Nachricht per e-mail,SMS und SNMP: http://www.messpc.de
Neu: Ethernetbox jetzt auch im 19 Zoll Gehäuse mit 12 Ports für Sensoren

Re: print Befehl hängtgelegentlich

am 12.10.2007 14:59:09 von Roman Racine

Lutz Schulze wrote:

> $messung = <$socket>;
> print "***";

[...]


> Ich bin nun nicht der Perl-Experte, deshalb die Fragen: wie könnte man das
> weiter eingrenzen (in Datei protokollieren?) oder solche falschen Zeichen
> unterdrücken bzw. was könnte print zu derlei Reaktion veranlassen?
>
> Für eure Tips dankt

Das Problem scheint nicht primär mit Perl zusammenzuhängen, sondern mit den
Systemaufrufen, die deine Perl-Anweisungen im Hintergrund generieren.

Meine Vermutungen:

TCP-Verbindung wird so unterbrochen, dass sie in einen Timeout läuft. Wenn
das plötzlich gehäuft auftritt, kann das mit einer stärkeren Belastung des
Servers, des Netzwerks, neuen Firewallregeln usw. zusammenhängen.

Eine andere Vermutung ist, dass du STDOUT irgendwohin umgeleitet hast, so
dass der print-Befehl blockiert.

Ich würde an deiner Stelle mal das ganze mit strace analysieren, dann sollte
relativ schnell klar sein, wo dein Skript hängt. Vermutlich musst du dann
so entstehende Fehler in deinem Programm irgendwie behandeln, das passiert
ja jetzt anscheinend nicht.

Gruss

Roman°
--
IRC-Freenode: #usenet-friends
http://www.usenet-friends.ch.vu/

Re: print Befehl hängtgelegentlich

am 12.10.2007 15:12:48 von Lutz Schulze

Am Fri, 12 Oct 2007 14:29:19 +0200 schrieb Lutz Schulze:

> Ich vermutete zuerst, dass das Problem bei der Zeile auftritt.

Sorry, statt 'Zeile' sollte es hier 'Abfrage' heissen.

Lutz

--
Mit unseren Sensoren ist der Administrator informiert, bevor es Probleme im
Serverraum gibt: preiswerte Monitoring Hard- und Software-kostenloses Plugin
auch für Nagios - Nachricht per e-mail,SMS und SNMP: http://www.messpc.de
Neu: Ethernetbox jetzt auch im 19 Zoll Gehäuse mit 12 Ports für Sensoren

Re: print Befehl hängt gelegentlich

am 12.10.2007 15:29:06 von Frank Seitz

Lutz Schulze wrote:

> was könnte print zu derlei Reaktion veranlassen?

Print blockiert genau dann, wenn der Ausgabekanal keine Daten mehr
entgegennimmt. Auf einem Unix-Terminal kann dies passieren, wenn
die Ausgabe vom Benutzer (nicht vom print) mit ^S angehalten wird.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: print Befehl hängt gelegentlich

am 12.10.2007 19:03:02 von Robert Berghaus

Lutz Schulze schrieb:

[...]

>=20
> Ich vermute nun, dass bei der Abfrage über das Netzwerk sporadisch ei=
n
> Zeichen mit in $messung gerät, mit dem print nicht klarkommt.

[...]

Gib doch den Text zuerst hexadezimal aus, dann kannst Du erkennen,=20
ob ein Sonderzeichen die Ausgabe anhält.


--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: print Befehl hängt gelegentlich

am 12.10.2007 20:06:19 von Lutz Schulze

Am Fri, 12 Oct 2007 19:03:02 +0200 schrieb Robert Berghaus:

> Gib doch den Text zuerst hexadezimal aus, dann kannst Du erkennen,
> ob ein Sonderzeichen die Ausgabe anhält.

Das ist gut, werde ich mal versuchen.

Leider dauern Tests immer 1-2 Tage, bis das Problem auftritt, ich melde mich
wieder. Dank auch an alle anderen für die Denkanstösse.

Lutz

--
Mit unseren Sensoren ist der Administrator informiert, bevor es Probleme im
Serverraum gibt: preiswerte Monitoring Hard- und Software-kostenloses Plugin
auch für Nagios - Nachricht per e-mail,SMS und SNMP: http://www.messpc.de
Neu: Ethernetbox jetzt auch im 19 Zoll Gehäuse mit 12 Ports für Sensoren

Re: print Befehl hängt gelegentlich

am 12.10.2007 20:16:17 von Slaven Rezic

Lutz Schulze writes:

> Hallo,
>
> ich habe hier einen Perl Script unter Linux, der gelegentlich (das passiert
> sporadisch nach Stunden oder auch mal nach 2 Tagen) ohne jedes Lebenszeichen
> hängt.
>
[...]
>
> Ich bin nun nicht der Perl-Experte, deshalb die Fragen: wie könnte man das
> weiter eingrenzen (in Datei protokollieren?) oder solche falschen Zeichen
> unterdrücken bzw. was könnte print zu derlei Reaktion veranlassen?
>

Du könntest Data::Dumper mit gesetztem Useqq-Flag verwenden. Damit
schützt man sich vor Sonderzeichen, aber mit sieht dennoch noch den
Bytewert des Zeichens.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

tknotes - A knotes clone, written in Perl/Tk.
http://ptktools.sourceforge.net/#tknotes

Re: print Befehl hängtgelegentlich

am 19.10.2007 10:22:41 von Lutz Schulze

Am Fri, 12 Oct 2007 14:29:19 +0200 schrieb Lutz Schulze:

> Ich vermutete zuerst, dass das Problem bei der Zeile auftritt. Dem ist aber
> nicht so. Wenn ich nur abfrage, aber etwas ganz anderes ausgebe läuft der
> Script problemlos durch (zumindest jetzt seit 4 Tagen):

Ich muss das korrigieren, dem ist nicht so. Bei weiteren Versuchen hing dann
auch das nach einigen Tagen mal fest.

Das Problem tritt also exakt in der Zeile der Abfrage auf:

$messung = <$socket>;

Ich vermute, dass sporadisch nichts gültiges bzw. zumindest kein
Zeilenabschluss kommt, auf den der Diamond-Operator wartet.
Da die TCP-Verbindung aber besteht, greift kein Socket-Timeout.

Ich habe die Abfrage jetzt auf read umgestellt und werde das weiter
beoachten.

Lutz

--
Mit unseren Sensoren ist der Administrator informiert, bevor es Probleme im
Serverraum gibt: preiswerte Monitoring Hard- und Software-kostenloses Plugin
auch für Nagios - Nachricht per e-mail,SMS und SNMP: http://www.messpc.de
Neu: Ethernetbox jetzt auch im 19 Zoll Gehäuse mit 12 Ports für Sensoren