Beenden spawn Sitzungen erwarten
Ich versuche, die ein Problem mit einem Skript Erwarten, dass die Protokolle in einer sehr großen Anzahl von Geräten (in tausend). Das Skript ist über 1500 Zeilen und ist ziemlich verwickelt; seine Aufgabe ist das überwachen verwalteten Geräten in einem Netzwerk mit vielen tausend Knoten. Als Ergebnis, es meldet sich die Geräte über telnet Befehle ausgeführt werden um zu überprüfen, auf die Gesundheit der Ausrüstung, protokolliert diese Informationen in einer Datei, und dann ausloggt, gehen Sie zum nächsten Gerät.
Dies ist, wo ich bin, läuft in mein problem; jedes expect
in meinem Skript enthält ein Zeitlimit und ein eof-wie so:
timeout {
lappend logmsg "$rtrname timed out while <description of expect statement>"
logmessage
close
wait
set session 0
continue
}
eof {
lappend logmsg "$rtrname disconnected while <description of expect statement>"
logmessage
set session 0
continue
}
Mein letzten expect
schließt jede spawn-Sitzung manuell:
-re "OK.*#" {
close
send_user "Closing session... "
wait
set session 0
send_user "closed.\n\n"
continue
}
Den weiterhin bringen Sie das Skript zurück in die while-Schleife, initiiert die nächste spawn-Sitzung, vorausgesetzt, session = 0.
Die session 0 tracks, wenn ein spawn-Sitzung geschlossen wird, entweder manuell durch den timeout oder via EOF vor einem neuen spawn-Sitzung geöffnet wird, und alles scheint darauf hinzudeuten, dass die spawn-sessions werden geschlossen, noch nach tausend oder so gespawnt Sitzungen, bekomme ich die folgende Fehlermeldung:
spawn telnet <IP removed>
too many programs spawned? could not create pipe: too many open files
Nun, ich bin ein Netzwerk-Ingenieur, nicht ein UNIX-admin-oder Profi-Programmierer, so jemand kann helfen, lenken mich in Richtung mein Fehler? Bin ich schließen spawn telnet-sessions, aber nicht ordnungsgemäß schließen einen Kanal? Ich schrieb einen zweiten, test-Skript, dass buchstäblich nur zum Anschluss von Geräten ein und trennt die Verbindung sofort, nachdem eine Verbindung gebildet wird. Es spielt keine log-in oder ausführen von beliebigen Befehlen als mein main-script nicht, und es funktioniert einwandfrei über Tausende von verbindungen. Das Skript ist unten:
#!/usr/bin/expect -f
#SPAWN TELNET LIMIT TEST
set ifile [open iad.list]
set rtrname ""
set sessions 0
while {[gets $ifile rtrname] != -1} {
set timeout 2
spawn telnet $rtrname
incr sessions
send_user "Session# $sessions\n"
expect {
"Connected" {
close
wait
continue
}
timeout {
close
wait
continue
}
eof {
continue
}
}
In meinem script, ich bin die Protokollierung jeder einzelnen Verbindung und warum Sie möglicherweise EOF oder timeout (über die logmessage-Prozess, schreibt einen bestimmten Grund, auf eine Datei), und auch wenn ich nichts sehen, aber erfolgreich gespawnt verbindungen und geschlossene verbindungen, bekomme ich das gleiche problem mit meinem script, aber nicht das test-Skript.
Habe ich schon etwas Lesen über die Tötung von Prozess-IDs, aber so wie ich es verstehe, schließen sollte die Tötung der Prozess-ID des aktuellen spawn-Sitzung, und warten werden sollte, stoppen das Skript, bis der Prozess tot ist. Ich habe auch versucht mit einem einfachen "exit" - Befehl aus dem Geräte zum schließen der telnet-Verbindung, aber das produziert keine besseren Ergebnisse.
Ich kann einfach noch ein Vorschlag, wie man besser verfolgen, das öffnen und schließen von meinen Sitzungen und sicherzustellen, dass zwischen den Geräten keine spawn-Sitzungen offen bleiben. Jede Hilfe, die angeboten werden können, wird sehr geschätzt.
Danke!
Sieht aus wie die PID ändert, wenn eine neue Sitzung geöffnet wird. Ich versuche eine exec kill $pid vor meiner Nähe warten. Ich bin das laufen durch ein paar tausend Geräte jetzt zu sehen, wenn, kümmert es; anscheinend einige ältere Versionen des telnet-Befehl nicht immer in der Nähe Ihrer Prozesse korrekt.
Ich bin nicht davon überzeugt, dass die Inbetriebnahme
continue
innerhalb einer eof
- Klausel ist eine gute Idee, aber meine Kenntnisse Erwarten, ist noch ein wenig lückenhaft...Ich bin immer noch mit dem problem. Die Tötung der PID noch nicht scheinen, um das problem zu beheben. Mein test-Skript verwendet weiterhin innerhalb von ein eof-ohne Probleme.
hat eine nette Antwort. Ich würde vorschlagen, erwägen Sie die Verwendung von ssh anstelle von telnet. Dadurch wird die Sicherheit verbessert. Sie erhalten den zusätzlichen Vorteil, dass die ssh-schließt mehr wie man erwarten würde, statt der zwei-Schritt-Prozess, telnet verwendet.
InformationsquelleAutor Eleck | 2013-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler???
Dieser Fehler ist wahrscheinlich auf Ihrem system ausführen aus dem Datei-handles (oder zumindest anstrengend die Zählung zur Verfügung, um Sie).
Ich vermute, der Grund dafür ist, aufgegeben telnet-Sitzungen, die Links zu öffnen.
Nun lassen Sie uns darüber reden, warum Sie immer noch irgendwo herum.
Nicht Sogar Nahe?
Schließen kann eigentlich nicht schließen Sie die telnet-Verbindung, vor allem, wenn telnet nicht erkennen, die Sitzung wurde geschlossen, nur erwarten, dass die Sitzung mit telnet (Siehe: Der Befehl "schließen"). In diesem Fall Telnet ist wahrscheinlich am Leben gehalten, warten auf mehr input von der Netz-Seite und durch eine TCP-keepalive.
Nicht alle Programme erkennen, die in der Nähe, die wird als ein EOF an die empfangende Anwendung. Denn dieses dürfen Sie offen bleiben, auch wenn deren Eingang wurde geschlossen.
Sagen, "Telnet", dann ist Es Vorbei.
In diesem Fall müssen Sie zu unterbrechen, telnet. Wenn Ihre Absicht ist, um eine Arbeit und Ausfahrt. Dann ist das genau das, was wir tun müssen.
Für "telnet" können Sie sauber verlassen werden, indem die Ausgabe von "senden "35\r"" (das wäre "Strg+]" auf der Tastatur, wenn Sie geben es selbst), gefolgt von "beenden" und dann ein carriage return. Dies wird Ihnen sagen, Sie telnet, um würdevoll beenden.
Erwarten Drehbuch: telnet starten, Befehle ausführen, schließen telnet
Auszug:
Warten, Für Das Finish.
Erwarten - Den wait-Befehl
Ohne "warten", erwarten kann, trennen Sie die Verbindung, um den Prozess vorzeitig, kann dies die Ursache der Schöpfung zombies in einigen seltenen Fällen. Wenn die Anwendung nicht bekommen unsere signal früher (EOF aus der Nähe), oder wenn der Prozess nicht interpretieren EOF als exit-status, dann kann es auch weiter ausgeführt und das Skript würde nicht klüger sein. Mit warten, wir gewährleisten, dass wir nicht vergessen, über den Prozess, bis es bereinigt und beendet.
Sonst dürfen wir nicht in der Nähe jeder dieser Prozesse erwarten, bis beendet. Dies könnte dazu führen, dass wir ausgehen von Datei-handles, wenn keiner von Ihnen in der Nähe für eine lange Laufzeit zu erwarten-Skript (oder eine, die verbindet, um eine Menge von Servern). Sobald wir ausgehen von Datei-handles, erwarten, und alles begann es gerade stirbt, und Sie nicht sehen, diese Datei-handles erschöpft, nicht mehr.
Timeout?, Alle fangen?, Warum?
Möglicherweise möchten Sie auch zu prüfen, mit einem "timeout" für den Fall, dass der server nicht antwortet, wenn erwartet, so dass wir vorzeitig beenden. Dies ist ideal für eine stark verzögerte-Server, die sollten stattdessen bekommen einige admin Aufmerksamkeit.
Fangen Sie alle können helfen, Ihre Skript-Umgang mit unerwarteten Reaktionen nicht unbedingt verhindern, dass wir von Weiterbildung. Wir können Sie nur weiter verarbeiten, oder wir könnten Sie beenden zu früh.
Erwarten Beispiele Auszug:
InformationsquelleAutor Joshua Briefman