2013-05-15 4 views
7

Sto scrivendo uno script usando expect in cui devo rlogin ad alcuni host & dopo che ho bisogno di inviare alcuni comandi. Ora voglio uscire su quell'host e collegarlo di nuovo ad un altro host e inviare alcuni comandi. Ma l'esecuzione del mio script non aspetta che il primo host completi i suoi lavori ed esce invece invia altri comandi tra il processo precedente. Come posso raggiungere questo risultato? Si prega di guidare?Come attendere il completamento di un processo usando tcl-expect

codice di esempio è la seguente:

#!/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 

risposta

0

Puoi approfondire

Ho provato questo e ha funzionato.

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

si sta dimenticando di "premi invio". Dopo l'invio di uscita, la strada per attendere che il processo di porre fine os expect eof: "ancora sceneggiatura invio resto dei comandi nel tra il processo precedente"

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

è già lì nel mio codice, ho dimenticato di dire che qui nel mio codice –

+0

ciò che è già lì? il 'eof' o il' \ r'? Si prega di aggiornare la tua domanda per essere più precisi. –

+0

si aspetta anche che eof non funzioni. ancora script che invia il resto dei comandi tra il processo precedente. –

1

Prova questa costrutto quando command è in termini di tempo:

. . . 
send "command\r" 

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

send "next command\r" 
. . . 

Su timeout vi verrà continuamente aspettando con exp_continue di comando per %PROMPT%.

+0

Life saver man! grazie per questa risposta! –

1

Ho trovato questo post dopo che mi sono imbattuto in un problema di condizioni di gara: a volte lo script è stato completato come previsto e altre volte no. L'aggiunta di una dichiarazione catch allo script assicurato il risultato desiderato ogni volta:

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

prendere "qualche ultima linea", ha rimosso con successo una condizione di gara per me. L'output da expect ora è sempre completo. Invece di solo qualche volta. – user18099