2013-05-15 17 views
7

Piszę skrypt przy użyciu oczekiwać, w którym muszę rlogin do jakiegoś hosta & po tym muszę wysłać kilka poleceń. Teraz chcę wyjść z tego hosta i ponownie zalogować się do innego hosta i wysłać kilka poleceń. Ale uruchomienie mojego skryptu nie czeka na pierwszego hosta, aby zakończyć swoje zadania i zakończyć, zamiast tego wysyła inne polecenia pomiędzy poprzednim procesem. Jak mogę to osiągnąć, oczekując instrukcji?Jak poczekać na zakończenie procesu przy użyciu tcl-expect

Przykładowy kod jest następujący:

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

spawn rlogin host1 
expect "%" 
send "source xyz.csh\r" 
send "exit\r" 
expect "%" 

spawn rlogin host2 
some set of commands 

Odpowiedz

0

można opracować na

Próbowałem tego i zadziałało.

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

jesteś zapominając "Hit enter". Po wysłaniu wyjście, tak aby czekać na proces do końca os expect eof: „nadal skrypt wysyłania resztę poleceń pomiędzy poprzednim procesie”

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

to już jest w moim kodu, zapomniałem o tym wspomnieć w moim kodzie –

+0

co już tam jest? 'eof' lub' \ r'? Zaktualizuj swoje pytanie, aby było bardziej precyzyjne. –

+0

oczekiwać, że eof również nie działa. wciąż skrypt wysyłający pozostałe komendy pomiędzy poprzednim procesem. –

1

Spróbuj konstrukt kiedy command jest czasochłonne:

. . . 
send "command\r" 

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

send "next command\r" 
. . . 

Na timeout będziesz continuosly czeka z poleceniem exp_continue dla %PROMPT%.

+0

Ratownik życia! dzięki za tę odpowiedź! –

1

Znalazłem ten post, gdy wpadłem w problem z wyścigiem: czasami skrypt został zakończony jako , oczekiwany, a innym razem nie. Dodanie catch oświadczenie do skryptu zapewnione pożądany efekt za każdym razem:

[...] 
expect eof 
catch wait result 
+0

złap "ostatnią linię", pomyślnie usunął dla mnie warunek wyścigu. Wynik z oczekiwań jest teraz zawsze zakończony. Zamiast czasami. – user18099

Powiązane problemy