Слишком много программ, порожденных с Expect - PullRequest
0 голосов
/ 01 октября 2011

Я использую ожидаемый модуль для выполнения задачи.

Это образец моего кода

foreach temp $list {
    spawn -X $temp

    while {1} {
        expect {
            eof {break}
            "password {send "password\r"}
            "\]"      {send "exit\r"}
        }
    }
}

Скрипт получает перерыв после 1071 счетчика. с ошибкой

too many programs spawned? could not create pipe: too many file open
    while executing
"spawn ssh -X ..." 

Ответы [ 2 ]

4 голосов
/ 01 октября 2011

Существует относительно низкий лимит на количество одновременных программ, которые могут быть запущены одновременно (это зависит от того, сколько виртуальных терминалов поддерживает ваша система; я действительно удивлен, что у вас там более 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
}
0 голосов
/ 01 октября 2011

Похоже, у меня возникла похожая проблема.Вы пробовали ulimit -a и проверяли процессы или файлы?

...