2011-10-01 48 views
0

我正在使用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 ..."

回答

4

同时生成的同步程序数量相对较低(取决于系统支持多少个虚拟终端;我真的很惊讶,你在那里超过1000个......)所以你需要一旦你完成了它们,Expect就会收获那些旧程序(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

感谢您的回复。但我仍面临同样的问题。我还观察到spawn ssh正在/ dev/null /位置创建一个无法关闭的文件描述符。由于最大限制是1024(使用ulimit -a进行检查,所以当它超过这个限制时,抛出错误“生成了太多程序?无法创建管道:打开太多文件 正在执行” –

+0

我已经添加了等待命令问题仍然存在 –

+0

研究员我希望得到的解决方案只需在等待之后简单地添加'code' close $ spawn_id'code'按照donal建议的 –

0

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

相关问题