Я пытаюсь решить проблему со сценарием Expect, который регистрируется на очень большом количестве устройств (тысячи). Сценарий состоит примерно из 1500 строк и довольно запутан; его работа заключается в проверке управляемого оборудования в сети со многими тысячами узлов. В результате он входит в устройства через telnet, выполняет команды для проверки работоспособности оборудования, записывает эту информацию в файл, а затем выходит из системы, чтобы перейти к следующему устройству.
Здесь я сталкиваюсь со своей проблемой; каждый expect
в моем скрипте включает тайм-аут и eof следующим образом:
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
}
Мой последний expect
закрывает каждую сессию появления вручную:
-re "OK.*#" {
close
send_user "Closing session... "
wait
set session 0
send_user "closed.\n\n"
continue
}
Продолжения возвращают скрипт обратно в цикл while, который инициирует следующий сеанс порождения, предполагая, что сеанс = 0.
Установленный сеанс 0 отслеживает, когда сеанс порождения закрывается либо вручную по тайм-ауту, либо через EOF до открытия нового сеанса порождения, и все, кажется, указывает на то, что сеансы порождения закрываются, но после тысячи или около того порожденных сеансов я получаю следующая ошибка:
spawn telnet <IP removed>
too many programs spawned? could not create pipe: too many open files
Я сетевой инженер, а не администратор UNIX или профессиональный программист, так что может ли кто-нибудь помочь мне исправить мою ошибку? Я закрываю сеансы запуска telnet, но неправильно закрываю канал? Я написал второй, тестовый скрипт, который буквально просто подключается к устройствам по одному и отключается сразу после установления соединения. Он не входит в систему и не запускает никаких команд, как это делает мой основной скрипт, и безупречно работает при тысячах подключений. Этот скрипт ниже:
#!/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
}
}
В моем основном скрипте я регистрирую каждое отдельное соединение и причины, по которым они могут быть EOF или тайм-аут (через процесс logmessage, который записывает конкретную причину в файл), и даже когда я не вижу ничего, кроме успешных созданных соединений и закрытых соединений, я получаю такая же проблема с моим основным скриптом, но не с тестовым скриптом.
Я кое-что читал об уничтожении идентификаторов процессов, но, насколько я понимаю, close должен убивать идентификатор процесса текущего сеанса создания, а wait должен останавливаться. сценарий, пока процесс не будет мертв. Я также пытался использовать простую команду «выход» с устройств, чтобы закрыть соединение telnet, но это не дает лучших результатов.
Мне может просто понадобиться предложение о том, как лучше отслеживать открытие и закрытие моих сеансов и гарантировать, что между устройствами ни один из сеансов порождения не останется открытым. Любая помощь, которая может быть предложена, будет высоко оценена.
Спасибо!
continue
внутри предложенияeof
— хорошая идея, но мои знания Expect все еще немного неоднородны… - person Donal Fellows   schedule 06.11.2013Ctrl + ']'
), чтобы закрыть сеанс telnet вместоclose
иwait
? - person Dinesh   schedule 29.12.2016