【问题标题】:Expect script does not exit after completion完成后期望脚本不退出
【发布时间】:2011-12-30 11:39:42
【问题描述】:

我有以下情况。

我的主要 expect 脚本看起来像这样

#!/usr/bin/expect -d
set timeout 900
spawn main_ksh_script.ksh [lindex $argv 0]
expect {
        "Press ENTER to Continue" {
            send_user "Message1\n"
            send "\r"
            exp_continue}
        "Press any key to continue" {
            send "\r"
            exp_continue}
         eof {
            send "\003\177\015"
            send_user "EOF reached\n"
            exit 0}
         timeout {
            send_user "Job timed out\n"
            send "\003\177\015"
            exit 100}
}
interact {
\015 {send "\015"}
\003 {send "\003\177\015"}
"\033\[3~" {send "\177"}
}

我的主要 korn shell 脚本 (main_ksh_script.ksh) 是一个非常庞大的脚本,它对所需的环境做了很多事情。其中之一是运行守护进程和一些远程作业。这是一个非常简短的例子......

while true; do
    clear
    echo "\n\tDo You Want to deploy xxx!!!  ([Yes]/No) \c"
    read yn1 ;
    case ${yn1} in
    [Yy]*|$enter)
        clear
        echo "SomeJobName1" on Environment (${envNum})\n"
        secondScript.expect environment$envNum@host "Some command(s)"
        echo "End of SomeJobName1" on Environment (${envNum})\n"

        echo "SomeJobName2" on Environment (${envNum})\n"
        secondScript.expect environment$envNum@host "Some command(s)"
        echo "End of SomeJobName2" on Environment (${envNum})\n"

        #And so on...
        break ;;
    [Nn]*) break ;;
    *) echo "\n\tPlease choose Yes or No\c"; pau ;;
    esac
    pau
done

secondScript.expect 看起来像这样...

#!/usr/bin/expect -d
set timeout 300
spawn ssh -o PubkeyAuthentication=no [lindex $argv 0] -n [lindex $argv 1]
expect {
        "Operational Job ended successfully" {
                send "\003\177\015"
                exp_continue}
        "Operational Job ended with failure" {
                send "\003\177\015"
                exp_continue}
        "Press ENTER to Continue" {
                send "\r"
                exp_continue}
        "Press any key to continue" {
                send "\r"
                exp_continue}
        "Password:" {
                send "mypassword\r"
                exp_continue}
        eof {
                send "\003\177\015"
                send_user "EOF reached\n"
                exit 0}
        timeout {
                send "\003\177\015"
                exit 100}
}
interact

问题是,当 main_ksh_script.ksh 完成时,第一个期望脚本(通过生成进程调用它的脚本)不会退出。我必须打开新终端,并通过“kill -9”将其杀死。连 Ctrl+c 都不能发送。

编辑... 如果我从两个期望脚本中删除“交互”,我没有得到任何结果。这是主脚本尾部的样子。

expect: does " \c\r\n\r\n" (spawn_id exp6) match glob pattern "Press ENTER to Continue"? no
"Press any key to continue"? no
expect: read eof
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) " \c\r\n\r\n"

它仍然不会自行终止,我仍然无法通过任何其他方式杀死它,期待来自另一个终端的 kill 命令。

【问题讨论】:

    标签: linux shell scripting interpreter expect


    【解决方案1】:

    如果您希望第一个期望脚本结束,那么interact 命令最后在做什么? 你需要你的interact 命令来检测eof。

    interact {
      ...
      -o
      eof {puts "spawned process completed"; exit}
    }
    

    -o 表示以下规则 ("eof") 将从生成的进程中检测,而不是从用户中检测。

    【讨论】:

    • 感谢格伦的帮助。我不确定我是否完全理解你。所以,我应该从主/第一个期望脚本中的交互命令中删除所有内容(这三行),并用 -o 和 eof 替换它???我还应该从第二个期望脚本中删除交互吗?
    • 我想我不明白你:第二个脚本与 ksh 脚本有什么关系?第二个脚本真的是为了交互使用吗?
    • 我编辑了原始帖子,我希望这不会那么混乱。简而言之,第二个脚本在主 korn 脚本中用作许多地方的命令。请再看一遍这个问题,我想现在他们之间的关系就很清楚了。
    • 你能解释一下用“interact”结束你的期望脚本的目的吗?如果没有,请尝试删除那些尾随的交互命令。
    • 我尝试删除它们,但没有得到任何结果。我编辑了原始问题并将主要期望脚本的尾部添加到它。请查看它,也许它会有所帮助。对于迟到的答案,我很抱歉,但我无法随时运行此脚本...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多