使用Expect产生的程序太多了

时间:2011-10-01 10:50:03

标签: tcl expect

我正在使用expect模块执行任务。

这是我的代码示例

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 个答案:

答案 0 :(得分:4)

可以同时生成的同步程序数量相对较少(这取决于您的系统支持多少个虚拟终端;我真的很惊讶你有超过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
}

答案 1 :(得分:0)

听起来像我遇到的类似问题。 您是否尝试过ulimit -a并检查进程或文件?