我是新用的期待,让我感到很困惑。它与一种模式完美配合,但当第二种情况出现时,它完全忽略了出口。首先,这是我的代码。
#!/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:错误:tistdout:用法: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”。
谢谢大家
答案 0 :(得分:1)
我可以建议两件事,一件可以重写代码以避免重复。其次,我认为你在模式结束时匹配JsonUtility.FromJson
。单独尝试使用\n\r
或使用\n
,它将匹配零个,一个或两个行结尾。
\n?\r?
答案 1 :(得分:0)
好吧,经过一些测试我发现了问题。我似乎并不了解超时工作的预期效果。每次执行失败的迁移时,都会超过超时。
这对我来说并不明显,因为虽然超时超时,但脚本仍然一直在等待答案并打印出来,只是没有一个我期望获得的模式被检查。
解决方案是使用&#34;超时&#34;命令或将其设置得更高。我做了晚了,一切都运行良好。