2011-10-01 50 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並檢查過程或文件?