0

こんにちは、みんな

私はこれらの奇妙なことの原因を見つけました。それはコマンドです:「待機」を送信します

私はそれをテストするためにいくつかのスクリプトを書きました。

proc Login {pass} {
# send the password
}

proc Wait {} {
    expect "*]$*"
    sleep 1
}

proc sendl {message} {
    send "$message\r"
}

spawn ssh xxxxx.xxx.xxx
Login xxxxxxxx
Wait

sendl "cd /somepath/"
Wait
sendl "expect infiniteLoop.exp >/dev/null &"
Wait
***sendl "wait"***
Wait

sendl "TESTTEST"
Wait
sendl "HAHAHA"
Wait
sendl "DONEDONEDONE"
Wait

次の行の後にスタックする必要があります:sendl "wait"

しかし、結果は次のとおりです。

[xxx@xxxxx.xxx ~]$ cd /somepath/
[xxx@xxxxx.xxx folder]$ expect infiniteLoop.exp >/dev/null &
[1] 27260
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE
[xxx@xxxxx.xxx folder]$ 

シェルはまだ待機中ですが、フォローアップコマンドは応答なしで1つずつ送信されています。その行の後のすべてのexpectコマンドは無効のようです。そして、スクリプトは終了しました。

ここで何が起こったのかわかりません。期待コマンドが無効になる原因は何ですか?コマンド「wait」はプログラムではないようです(「whereiswait」を使用できません)。

4

1 に答える 1

0
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE

この種の出力は、おそらく予期タイムアウトが原因です。

私はinfiniteLoop.expが何をしているのか分かりません。実際に無限ループ (または時間がかかるもの) である場合wait、プロセス (infiniteLoop.exp) が終了しないため、次のシェル コマンドは常に待機します。

したがって、次のWait()proc の呼び出しは最終的に 10 秒ごとにタイムアウトになり (10 秒は既定のタイムアウトを期待する)、スクリプトは次のように続行されます。

sendl "TESTTEST"  (send message to spawned process)  
Wait  (process still waiting for infiniteLoop.exp, timeout after 10s.)  
sendl "HAHAHA"  (continue to send message)  
Wait  (process still waiting for infiniteLoop.exp, timeout after 10s.)  
sendl "DONEDONEDONE"  (continue to send message)  

Expect スクリプトが期待どおりに調整されない場合、私は常に次の 2 つのことを行います。

  • 最初の 1 つは、手順を手動で実行して、何か問題があるかどうかを確認することです。

  • 2 つ目は、デバッグ メッセージをオンにする-dexpect -d hello.expオプションを追加することです (例: )。「expect: timed out」のようなメッセージが表示された場合、前のパターンが一致しなかった可能性があります。

ところで、タイムアウトのケースを示すために少しチェックを追加できます

proc Wait {} {
    expect {
        "$" {}
        timeout {send_user "expect timeout\n"}
    }
    sleep 1
}
于 2012-10-05T03:44:46.307 に答える