Как дождаться завершения процесса с помощью tcl-expect



Я пишу сценарий, используя expect, в котором я должен rlogin к некоторому хосту и после этого мне нужно отправить некоторые команды. Теперь я хочу выйти на этот хост и снова переключиться на какой-то другой хост и отправить несколько команд. Но запуск моего сценария не ждет, пока первый хост завершит свои задания и завершит работу, вместо этого он посылает другие команды между предыдущими процессами.
Как я могу добиться этого, используя ожидайте, пожалуйста, руководство?



Пример кода выглядит следующим образом:



#!/usr/local/bin/expect -f

spawn rlogin host1
expect "%"
send "source xyz.cshr"
send "exitr"
expect "%"

spawn rlogin host2
some set of commands
613   4  

4 ответов:

Можете ли вы подробнее остановиться на " still script, отправляющем остальные команды между предыдущими процессами. "

Я попробовал это, и это сработало.

spawn ssh host1
expect ":"
send pwd1
expect "%"
send "echo hi\r"
expect "%"
send "exit\r"
expect eof
spawn ssh host2    
expect ":"
send pwd2

Вы забываете "нажать enter". После отправки exit, способ дождаться завершения процесса os expect eof:

send "source xyz.csh\r"
expect "%"
send "exit\r"
expect eof

Попробуйте эту конструкцию, Когда command занимает много времени:

. . .
send "command\r"

expect {
    timeout {
        puts "Running..."
        exp_continue
    }
    "%PROMPT%" {
        puts "Finished."
    }
}

send "next command\r"
. . .

На timeout вы будете непрерывно ждать с командой exp_continue для %PROMPT%.

Я нашел этот пост после того, как столкнулся с проблемой состояния гонки: иногда сценарий выполнялся так, как ожидалось, а в других случаях этого не произошло. добавление оператора catch к сценарию обеспечивало желаемый результат каждый раз:

[...]
expect eof
catch wait result

Comments

    Ничего не найдено.