是否可以生成应用程序,发送命令,期望结果,还可以“重生”'应用程序,如果它崩溃并从最后一点继续?我尝试创建产生的过程,但是一旦应用程序关闭,我就无法捕获用户shell提示符
答案 0 :(得分:0)
所以听起来你正在做类似telneting或sshing的事情 进入shell然后运行应用程序。申请死亡或 挂起所以提示不会返回所以期望不返回等等 你被卡住了您将需要使用超时来检测挂起并重新启动 你的整个过程(包括产卵)。下面是我写作时开始的锅炉板 期待脚本。帮助您解决问题的关键是什么 要意识到spawn不仅设置spawn_id而且还返回 产生过程的pid。你可以使用那个pid来杀死它 如果你得到一个eof和/或超时,则会产生进程。我的锅炉板 在超时时杀死spawn进程。超时没有保释 期待循环但在退出之前等待eof。它也积累了 expect命令的输出如此超时你可能会看到 它去世的地方。样板文件位于一个名为run的proc中。产生这个过程 并传递pid和spawn id。重新使用锅炉板来定义其他 推动这将是步骤。将procs放在一个带有计数器的脚本中 他们如图所示并重复。另一个回答者是正确的,除非应用程序 重新开始你离开的地方,你需要从头开始。如果它确实从 你离开的地方。使步骤足够精细,你知道什么命令 重复。并从步骤开始。 BoilerPlate
proc run { pid spawn_id buf } {
upvar $buf buffer; #buffer to accumulate output of expect
set bad 0;
set done 0;
exp_internal 0; # set to one for extensive debug
log_user 0; # set to one to watch action
expect {
-i $spawn_id
-re {} {
append buffer $expect_out(buffer); # accumultate expect output
exp_continue;
}
timeout {
send_user "timeout\n"
append buffer $expect_out(buffer); # accumultate expect output
exec kill -9 $pid
set bad 1
exp_continue;
}
fullbuffer {
send_user " buffer is full\n"
append buffer $expect_out(buffer); # accumultate expect output
exp_continue;
}
eof {
send_user "Eof detected\n"
append buffer $expect_out(buffer); # accumultate expect output
set done 1 ;
}
}
set exitstatus [ exp_wait -i $spawn_id ];
catch { exp_close -i $spawn_id };
if { $bad } {
if { $done } {
throw EXP_TIMEOUT "Application timeout"
}
throw BAD_ERROR "unexpected failure "
}
return $exitstatus
}
set count 0
set attempts 0 ; # try 4 times
while { $count == 0 && $attempts < 4 } {
set buff ""
set pid [spawn -noecho ssh user@host ]
try {
run $pid $::spawn_id buff
incr count
run2 $pid $::spawn_id buff
incr count
run3 $pid $::spawn_id buff
incr count
run4 $pid $::spawn_id buff
incr count
} trap EXP_TIMEOUT { a b } {
puts "$a $b"
puts " program failed at step $count"
} on error { a b } {
puts "$a $b"
puts " program failed at step $count"
} finally {
if { $count == 4 } {
puts "success"
} else {
set count 0
incr attempts
puts "$buff"
puts "restarting\n"
}
}
}