Существует относительно низкий лимит на количество одновременных программ, которые могут быть запущены одновременно (это зависит от того, сколько виртуальных терминалов поддерживает ваша система; я действительно удивлен, что у вас там более 1000) ... поэтому вам нужно пожинать плодыэти старые программы, как только вы закончите с ними (Expect действительно пожинает все при выходе, но здесь это важно, потому что у вас заканчивается намного раньше).Более того, предел будет зависеть от того, что еще происходит в вашей системе, поскольку виртуальные терминалы на самом деле являются системно-глобальным ресурсом ...
Чтобы пожинать старую программу, как только вы закончите с ней, добавьте wait
до конца цикла (при условии, что вы не хотите, чтобы подпроцесс продолжался после конца цикла, конечно), чтобы получить это:
foreach temp $list {
spawn -X $temp
while {1} {
expect {
eof {break}
"password" {send "password\r"}
"\]" {send "exit\r"}
}
}
wait ;#### <<<<<----- THIS!!!
}
Возможно, вы также захотите взглянуть наexp_continue
, поскольку это позволяет вам переписать, чтобы избавиться от явного while
(а также необходимости явно обрабатывать условие EOF) и в целом сделать ваш код проще:
foreach temp $list {
spawn -X $temp
expect {
"password" {send "password\r"; exp_continue}
"\]" {send "exit\r" ; exp_continue}
}
wait
}