处理tcl期待应用程序崩溃

时间:2015-06-17 16:09:41

标签: bash unix tcl expect

是否可以生成应用程序,发送命令,期望结果,还可以“重生”'应用程序,如果它崩溃并从最后一点继续?我尝试创建产生的过程,但是一旦应用程序关闭,我就无法捕获用户shell提示符

1 个答案:

答案 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"
        } 
    }
}