2016-05-09 47 views
0

我正在嘗試編寫一個expect腳本來啓動SSH隧道,等待隧道進程關閉(引發錯誤),然後重新運行tunnel命令。 (值得注意的是,autossh和其他自動隧道解決方案在這裏不相關,因爲我正在嘗試執行的操作涉及到expect。)這是包含故障排除消息的完整腳本。期待不會等待產生的進程

#!/usr/bin/expect 

set timeout 1 

while { $timeout == 1 } { 
    spawn -noecho ssh -f -N -T -R22224:localhost:22223 [email protected] 
    send_user "Looking for host" 
    set timeout 0 
    wait 
    set timeout 1 
    send_user "We've encountered an error. Re-running." 
} 

send_user "Out of the loop." 

ssh命令的工作,和expect man pagewait應持腳本,直到目前的衍生進程死了,但它不是不和它結束了重新運行循環一大堆倍(逼我pkill許多sshd實例在我的遠程計算機上)。我試過wait spawn,wait spawn_id,expect {ssh*}(根據手冊頁,它也應該讓腳本等待),但是沒有任何東西會使腳本暫停。

回答

1

ssh -f將fork一個子進程(在後臺運行),父進程將退出。預期的wait命令僅等待spawn ed父進程,因此wait將很快返回。

+0

謝謝,這就是我錯過了。所以我只需要將'expect'命令發送到後臺,一旦我確認它正在做我想做的事情。我可以做到這一點。 很高興知道,就像期待的手冊頁那樣充滿激情,這是我對Linux進程的無知的理解,而不是我誤解導致問題的文檔。 –