У меня следующая ситуация.
Мой основной сценарий выглядит примерно так
#!/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 из другого терминала.