我正在使用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 ..."
答案 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并检查进程或文件?