期望忽略模式匹配而不退出

时间:2016-04-13 19:14:06

标签: linux shell tcl expect

我是新用的期待,让我感到很困惑。它与一种模式完美配合,但当第二种情况出现时,它完全忽略了出口。首先,这是我的代码。

#!/usr/bin/expect

#Usage migration_test.xpct <ssh_password> <vmname> <no_migraciones>

set timest [ timestamp -format %Y-%m-%d_%H-%M ]
set vmname [lindex $argv 1]

log_file migtest_${vmname}_${timest}.log ;

set password [lindex $argv 0]
set num [lindex $argv 2]
set failureMsg "Status: Failure\n\r"
set timeout 60

spawn ssh admin@localhost -p 10000

expect "yes/no" {
    send "yes\r"
    expect "*?assword" { send "$password\r" }
    } "*?assword" { send "$password\r" }

for {set i 0} {$i < $num} {incr i 1} {
    expect "OVM> " {
        send "show Vm name=$vmname\r"
        expect {
            $failureMsg { }
            -re "Status = Running\n\r" {
                exp_continue
            }
            -re "Server = .*? \\\[(.*?)(1|2)?\\\]\n\r" {
                set destserver $expect_out(2,string);
                if { $destserver == 1 } {
                    send_user "\n\nMIGRATION [ expr $i+1 ] of $num\n\n"
                    send "migrate Vm name=$vmname destServer=serv_prod02\r"
                    expect {
                        -re "JobId: (.*?)\n\r" {
                            set jobid $expect_out(1,string);
                            send "show Job id=$jobid\r";
                            expect {
                                -re "Command:(.*?)\n\r" { send_user "\n\nWaiting 30secs before next migration\n\n";
                                sleep 30; }
                            }
                        }
                        -re "Status: Failure\n\r" { send_user "\n\nExiting\n"; exit 1 }
                    }
                } else {
                    send_user "\n\nMIGRATION [expr $i+1] of $num\n\n"
                    send "migrate Vm name=$vmname destServer=serv_prod01\r"
                    expect {
                        -re "JobId: (.*?)\n\r" {
                            set jobid $expect_out(1,string);
                            send "show Job id=$jobid\r";
                            expect {
                                -re "Command:(.*?)\n\r" { send_user "\n\nWaiting 30secs before next migration\n\n";
                                sleep 30; }
                            }
                        }
                        -re "Status: Failure\n\r" { send_user "\n\nExiting\n"; exit 1 }
                    }
                }
            }
        }
    }
}

send "exit\r"
expect eof

问题出现在它到达“迁移虚拟机”部分时。这是我发送给CLI的工作(确切地说是oracle ovm cli),工作可能失败或成功。我希望在成功时打印作业详细信息,但如果作业失败则完成整个执行(因为它已经显示原因而我不必扩展作业详细信息)。

以下是成功作业的输出结果:

  

移民5 of 12

     

迁移Vm name = slestest_temp_share_vm destServer = serv_prod01
  命令:migrate Vm name = slestest_temp_share_vm
  destServer = serv_prod01
  现状:成功   时间:2016-04-13 10:45:24,174
  JobId:12345678978
  OVM&GT;显示工作ID = 12345678978
  命令:show Job id = 12345678978
  状态:成功时间:2016-04-13 10:45:24,188
  数据:

     
    

运行状态=成功
    摘要状态=成功
    完成=是
    摘要完成=是
    工作组=否
    用户名= admin
    创作时间= 2016年4月13日上午10:44:45
    开始时间= 4月13日,201:10:44:45上午     结束时间= 2016年4月13日上午10:45:23
    持续时间= 37s
    Id = 12345678978 [将Vm:slestest_temp_share_vm迁移到服务器:serv_prod01]
    Name =将Vm:slestest_temp_share_vm迁移到Server:serv_prod01
    Description =将Vm:slestest_temp_share_vm迁移到     服务器:serv_prod01已锁定= false     OVM&GT;

  
     

在下次迁移之前等待30秒

以下是失业工作的样子:

  

移民4 of 12

     

迁移Vm name = slestest_temp_share_vm destServer = serv_prod01
  命令:migrate Vm name = slestest_temp_share_vm destServer = serv_prod01
  状态:失败
  时间:2016-04-13 11:31:08,819
  JobId:1460564963372
  错误消息:Core上的作业失败:OVMAPI_5001E作业:1460564963372 /迁移Vm:slestest_temp_share_vm到服务器:serv_prod01 /迁移Vm:slestest_temp_share_vm serv_prod01,失败。作业失败事件:1460565064570 /服务器异步命令失败/ OVMEVT_00C014D_001异步命令失败serv_prod02。对象:slestest_temp_share_vm,PID:1724,
  服务器错误:命令:['xm','migrate',' - live','0004fb00000600009f354416bab38df6','8.8.8.1']失败(1):stderr:错误:ti

     
    

stdout:用法:xm migrate

  
     

将域迁移到另一台计算机。

     

选项:

     

-h, - help打印此帮助。
  -l, - live使用实时迁移   -p = portnum, - port = portnum
                       使用指定的端口进行迁移   -n = nodenum, - node = nodenum
                      在目标上使用指定的NUMA节点   -s, - sl使用ssl连接进行迁移   -c, - change_home_server
                    更改托管域的主服务器。

     

,在服务器:serv_prod02上,与对象关联:0004fb00000600009f354416bab38df6 [Wed Apr 13 11:31:04 2016]

为什么忽略Status: Failure?此外,当发生这种情况时,它似乎会跳过循环的迭代,如果它在第5个,那么它会显示“例如12的迁移7”。

谢谢大家

2 个答案:

答案 0 :(得分:1)

我可以建议两件事,一件可以重写代码以避免重复。其次,我认为你在模式结束时匹配JsonUtility.FromJson。单独尝试使用\n\r或使用\n,它将匹配零个,一个或两个行结尾。

\n?\r?

答案 1 :(得分:0)

好吧,经过一些测试我发现了问题。我似乎并不了解超时工作的预期效果。每次执行失败的迁移时,都会超过超时。

这对我来说并不明显,因为虽然超时超时,但脚本仍然一直在等待答案并打印出来,只是没有一个我期望获得的模式被检查。

解决方案是使用&#34;超时&#34;命令或将其设置得更高。我做了晚了,一切都运行良好。