Perl Net::Ping Problem nach Reconnect
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
beitrag
berechtigte krone
betriebssystem
dokumentation
durchlauf
gelegenheit
implementierung
komplette bedienungsanleitung
konsole
legend
lsen
management
memory
objekt
protokoll
sache
sen
skript
speicher
wiederherstellung
-
Ich m?chte testen, ob Pings zu einem bestimmten Server im Internet ?ber l?ngere Zeit funktionieren und dachte das ist eine gute Gelegenheit in die legend?re Perlprogrammierung reinzuschnuppern. Mein Problem:
Das Skript, das ich erstellt habe, funktioniert nicht mehr nachdem die Internetverbindung unterbrochen und wiederhergestellt wurde. Nach der Wiederherstellung der Internetverbindung schl?gt jeder Ping fehl. Ich hoffe mal hier lesen auch ein paar Perl-Checker mit und k?nnen mir Tipps stecken.
Hier das Skript:
use Net::Ping;
$remotehost = "ir.gend.was";
while(1){
$p = Net::Ping->new("icmp");
if($p->ping($remotehost,1)) {
print "erreichbar\n";
}
else{
print "nicht erreichbar\n";
}
sleep(30);
$p->close();
}
Beitrag ge?ndert am 3.08.2005 02:24 von talpa -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi
Ich kenne mich zwar nicht mit Pearl aus,
Schade.
aber du versuchst mit einer Endlosschleife, welche nie eine Abbruchbedingung besitzt das ganze zu l?sen.
Jo, ich wollte ein auf das Wesentliche reduzierte Beispiel bringen...
Du solltest anderster an die Sache rangehen, besser durch einen min?tigen Cronjob, bzw. At, kommt drauf an welches Betriebssystem du hast.
Nat?rlich gibt's viele Wege nach Rom, aber ich w?rde den unheimlich gerne mit Perl gehen, weil momentan versuche mich da ein bisschen einzufuchsen.
Danke trotzdem! Weitere Tipps willkommen. -
Jaja, perl, die ungekr?nte K?nigin der Script-Sprachen ...
So, wie ich das sehe, erstellst du in jedem Schleifendurchgang ein neues Objekt $p und l?schst es dann wieder:
while(1){
$p = Net::Ping->new("icmp");
if($p->ping($remotehost,1)) {
...
sleep(30);
$p->close();
}
Ich denke, dass es besser w?re, das so zu schreiben:
$p = Net::Ping->new("icmp");
while(1){
if($p->ping($remotehost,1)) {
...
sleep(30);
}
$p->close();
Dann muss das Memory-Management nicht jedesmal Speicher f?r das Objekt anfordern und wieder freigeben.
Hast du dir schon mal die Dokumentation zu Net::Ping angeschaut? (Notfalls im Quelltext) Dort steht (im Gegensatz zu den gr?sslich dokumentierten PEAR-Modulen von PHP) meist die komplette Bedienungsanleitung drin.
Wenn ich noch was Besseres finde, meld ich mich nochmal.
MfG
alope(rl)x
Beitrag ge?ndert am 3.08.2005 19:33 von alopex -
Jaja, perl, die ungekr?nte K?nigin der Script-Sprachen ...
Warum eigentlich ungekroent?
Naja, wenigstens hat das Fuexchen seine berechtigte Krone erhalten.
Dann muss das Memory-Management nicht jedesmal Speicher f?r das Objekt anfordern und wieder freigeben.
Jo, so hatte ich das zunaechst auch, dachte jedoch anfangs, dass sich ich das Problem vielleicht loesen koennte, wenn das Net::Ping-Objekt in jedem Durchlauf neu initialisiert wird. Hab's dann wegen Faulitaet nicht wieder zurueckveraendert;)
Ok, mittlerweile habe ich es auch unter Linux duchexerziert, die Doku nochmal durchforstet und auch im Bug-Report gelesen und es scheint so, dass die Implementierung vom ICMP-Protokoll im Net::Ping-Modul nicht wirklich kugelsicher ist. Daher bin ich von ICMP ab und siehe da, mit dem TCP-Protokoll funktioniert es so wie ich es haben moechte. Wenn nicht auf das ICMP-Protokoll verzichtet werden kann, koennte man alternativ auch den ping-Befehl aus der Befehlszeile/Konsole im Perlskript verwenden und dessen Ausgabe auswerten. Fuer meine Zwecke reicht allerdings TCP und ich bin zufrieden :)
He, wusste gar nicht, dass Lima auch mit dem Konqueror funktioniert oder auch umgekehrt, nur die "Fomartierung eingfuegen"-Buttons zeigen sich gerade nicht kooperativ...
Gut's Naechtle!
Beitrag ge?ndert am 4.08.2005 00:05 von talpa
edit:
Nun ich dachte ich w?re zufrieden, aber als ich dann wieder von Linux auf W2K umgeschaltet habe, konnte ich sehen, dass tcp mit ActivePerl 5.6.1 und Net::Ping auch nicht funktioniert. Seitdem verwende ich den Ping aus der Konsole im Skript und es funktioniert einwandfrei (bisher?).
Beitrag ge?ndert am 4.08.2005 23:54 von talpa -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage