2016-05-09 4 views
0

私はexpectスクリプトを記述してSSHトンネルを開始しようとしていますが、トンネルプロセスが終了するのを待って(エラーを投げて)、トンネルコマンドを再実行します。 (autosshとその他の自動トンネリングソリューションはここでは関係ありません。私がしようとしているのはexpectです。)これはトラブルシューティングのメッセージを含む完全なスクリプトです。生成されたプロセスを待つことはありません

#!/usr/bin/expect 

set timeout 1 

while { $timeout == 1 } { 
    spawn -noecho ssh -f -N -T -R22224:localhost:22223 [email protected] 
    send_user "Looking for host" 
    set timeout 0 
    wait 
    set timeout 1 
    send_user "We've encountered an error. Re-running." 
} 

send_user "Out of the loop." 

sshコマンドの機能、およびexpect man pageは、現在生成されたプロセスが死ぬまでwaitは、スクリプトを保持するべきであると述べているが、それはしていませんし、それが私を強制的に(ループを何回の全体の束を再実行終わりますpkillリモートマシン上の多くのsshdインスタンス)。私はwait spawnwait spawn_idexpect {ssh*}(マニュアルページによると、スクリプトを待たなければならない)を試みましたが、何もスクリプトを一時停止させません。

答えて

1

ssh -fは、子プロセス(バックグラウンドで実行中)をフォークし、親プロセスは単に終了します。 Expectのwaitコマンドは親プロセスのspawnを待つだけなので、すぐにwaitが返されます。

+0

ありがとう、それは私が行方不明だった。ですから、 'expect'コマンドをバックグラウンドに送って、それが私が望むことをしていることを確認しておかなければなりません。私はそれを行うことができます。 期待しているマニュアルページほど怒っているのは、Linuxプロセスについての私の気まぐれな理解であり、問​​題の原因となったドキュメントの誤読ではありません。 –

関連する問題