Ожидать сценарий не завершается после завершения - PullRequest
0 голосов
/ 16 ноября 2011

У меня следующая ситуация.

Мой основной сценарий выглядит примерно так

#!/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 (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 из другого терминала.

1 Ответ

2 голосов
/ 16 ноября 2011

Если вы хотите, чтобы первый ожидаемый сценарий завершился, что команда interact делает в конце? Вам нужна команда interact для обнаружения eof.

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

-o указывает, что следующие правила ("eof") должны быть обнаружены из порожденного процесса, а не от пользователя.

...