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!

Dieser Artikel "Too many Open Files error message" helfen könnte.
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

Schreibe einen Kommentar