2016-05-09 46 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进程的无知的理解,而不是我误解导致问题的文档。 –