如何使用tcl-expect等待进程完成

时间:2013-05-15 10:48:51

标签: shell tcl expect

我正在编写一个使用expect的脚本,其中我必须rlogin到某个主机&之后我需要发送一些命令。现在我想退出到该主机并再次重新登录到其他主机并发送一些命令。但是我的脚本运行不是等待第一个主机完成其作业而是退出,而是在前一个进程之间发送其他命令。 我怎样才能达到这个目的,请指导?

示例代码如下:

#!/usr/local/bin/expect -f

spawn rlogin host1
expect "%"
send "source xyz.csh\r"
send "exit\r"
expect "%"

spawn rlogin host2
some set of commands

4 个答案:

答案 0 :(得分:8)

你忘了"点击进入"。发送退出后,等待进程结束os expect eof的方式:

send "source xyz.csh\r"
expect "%"
send "exit\r"
expect eof

答案 1 :(得分:2)

我在遇到竞争条件问题后发现了这篇文章:有时脚本以预期完成,有时则没有完成。在脚本中添加catch语句可确保每次都获得所需的结果:

[...]
expect eof
catch wait result

答案 2 :(得分:1)

command耗时时尝试此构造:

. . .
send "command\r"

expect {
    timeout {
        puts "Running..."
        exp_continue
    }
    "%PROMPT%" {
        puts "Finished."
    }
}

send "next command\r"
. . .

timeout上,您将继续使用exp_continue的{​​{1}}命令等待。

答案 3 :(得分:0)

您能否详细说明“仍然在上一个过程之间发送其余命令的脚本。”

我试过这个并且有效。

spawn ssh host1
expect ":"
send pwd1
expect "%"
send "echo hi\r"
expect "%"
send "exit\r"
expect eof
spawn ssh host2    
expect ":"
send pwd2