00375 02/06/27 11:56 RE:00374 wait文
投稿者 : akihihi   コメントを投稿する

akihihiです 


>横から済みません
>
>》スクリプトのwait文が急に動作しなくなって、send文が即時実行されてしまいます。
>》なにか原因はありませんか?下記のようなパターンでプロンプトをまって
>》コマンドを発行してます。何か特殊文字等でwait文が機能しなくなるで
>》しょうか?
>
>一番はじめの発言で、「急に動作しなくなって」とあったので
>前は動いてたけど、秀Termのバージョンアップとか「なにかしたら」
>うまくプロンプトを待てなくなった、そう解釈したのですがそれでいい
>でしょうか。
> また、「なにかした」というのが発言番号00372にあるスクリプトで

 いえ、それまでのwaitして、sendするパターンの部分がうまく動作いて
て、有る部分にくると動作がおかしいとのいみです。


>
>》;**********************
>》;*****      ログ表示          *****
>》;**********************
>中略
>》
>》wait    "DAISUB2M"
>》;sleep 1
>》send "cat da2tux.log" + "^M"
>
>このsleep 1をコメントアウトした、ということだったり
>しますでしょうか?
>                             Νογικο
このsleep文については気にしないでください。


00376 02/06/27 12:10 RE:00373 wait文
投稿者 : akihihi   コメントを投稿する

指摘いただいてますように、サーバからのプロンプトが完全に返却され
文字が送信されてこないことを待つようにします。ただ一点質問があり
ます。よろしくお願いします



> 中身を理解するのが困難なので、解読は途中で挫折させていただきます。
>
> それよりも、1つ間違いの元のような物を見つけました。
>
> 秀Termのsend文は、実際に文字列を送信する前に終了します。例えば
>
>    send "cat da2ora.log" + "^M"
>    writebuffer "AAAA"
>
> とすると、catコマンドの前にAAAAが出てくるはずです。
>
> その辺で誤解があるんじゃないかという気がします。
>
> 例えば上記の例で言うなら、catコマンドの送信(およびそのエコーバック)を待
>ってから次の処理をさせたいなら、
>
>    send "cat da2ora.log" + "^M"
>    wait "^M^J"
>    writebuffer "AAAA"
>
> のように記述しないとダメです。
>
> あとあと、全体的に、ホストからのプロンプトを完全に待つことなくsend文を使っ
>てますが、これもあまりよくないです。
>
> 例えば
>
>    wait "DAISUB2M"
>    send "cat da2ora.log" + "^M"
>
> の部分がありますが、ここは出来れば
>
>    wait "DAISUB2M"             −−−@
>    wait  postidle(1)  ": "         −−−A
>    send "cat da2ora.log" + "^M"
>
> のように正確にプロンプトを待ってから送信するようにした方がいいと思います。
 ここで質問なんですが、@のwaitとAのwaitを記述されてますが
WAITの処理メカニズムについて質問です。
 (1)wait文でチェックする検索のシーケンスは?@を検索した
    あと、Aでもう一度そのバッファを検索する?
 (2)また、バッファですが更新契機はいつでしょうか?

上記の場合は@の文字が来たあとにAの文字が来るパターン(受信内
容が例:『DAISUB2M[22]:』のような受信のケース)の場合の記述で
すよね。

そこで、こうするとどうなりますか?当然Cで待ちとなりタイムアウト
になるまで停止しますよね
    wait "DAISUB2M"             −−−B
    wait "DAISUB2M"             −−−C
    send "cat da2ora.log" + "^M"


00377 02/06/27 16:07 RE:00376 wait文
投稿者 : 秀まるお2   コメントを投稿する

> (1)wait文でチェックする検索のシーケンスは?@を検索した
>    あと、Aでもう一度そのバッファを検索する?

 違うというか、なんちゅうか、全然違うと言うべきか…。

 wait文で例えば"ABC"をwaitするとして、実際に"ABCDEFG"を受信したとすると、
"ABC"の部分まで受信した扱いとなり、次の"DEFG"は受信してない扱いとなります。

 なんちゅうか、その辺の同期はしっかりしていると言ったらいいのやら?

 例えば、wait "ABC"と書くことと、wait "A"、wait "B"、wait "C"と3行書くこと
はほとんど同じ意味です。

 例えば

     ABC[100]XYX:

 というようなプロンプトがあって、角カッコの中の数字が任意に変化するような場
合、

    wait "ABC"
    wait "XYX:"

 と書く方が正確になるかなぁと思うだけです。別に「wait "XYZ:"」だけでもいい
んですけど。

 正確にプロンプトを待ち、さらにホストが何も送信してこなくなるのを待つために
は、postidle(1)とかも入れてあげるとなおいいです。


00378 02/06/27 17:40 RE:00377 wait文
投稿者 : akihihi   コメントを投稿する

おつきあいありがとうございます。ねちっこくてすみません
文字のみで意味を伝えるの難しいです・・・。不足なのが多々ありますが・・・。



>> (1)wait文でチェックする検索のシーケンスは?@を検索した
>>    あと、Aでもう一度そのバッファを検索する?
>
> 違うというか、なんちゅうか、全然違うと言うべきか…。
>
> wait文で例えば"ABC"をwaitするとして、実際に"ABCDEFG"を受信したとすると、
>"ABC"の部分まで受信した扱いとなり、次の"DEFG"は受信してない扱いとなります。
>
> なんちゅうか、その辺の同期はしっかりしていると言ったらいいのやら?
>
> 例えば、wait "ABC"と書くことと、wait "A"、wait "B"、wait "C"と3行書くこと
>はほとんど同じ意味です。
>
> 例えば
>
>     ABC[100]XYX:
>
> というようなプロンプトがあって、角カッコの中の数字が任意に変化するような場
>合、
>
>    wait "ABC"
>    wait "XYX:"
>
> と書く方が正確になるかなぁと思うだけです。別に「wait "XYZ:"」だけでもいい
>んですけど。
>
> 正確にプロンプトを待ち、さらにホストが何も送信してこなくなるのを待つために
>は、postidle(1)とかも入れてあげるとなおいいです。

 比較するポイントが移動するイメージですね。
 ここで仮に
 「abcabcabc」(abcを三回受信)
 と受信バッファに有る場合
 wait "abc"   
  wait "abc"
  wait "abc"
  としてはじめて比較する文字がないとなるわけですね。
 これからすると上記とおなじケースで
 wait "abc"
 wait "cdf"
 としてtimeoutとなった場合に於いては
 次にWait文をいれると比較(受信?)は
 どこからされますか?二つ目のabcからですか?


00379 02/06/27 18:03 (発言者削除)
投稿者 : ぴぴ



00380 02/06/27 18:26 RE:00378 wait文
投稿者 : 秀まるお2   コメントを投稿する

> これからすると上記とおなじケースで
> wait "abc"
> wait "cdf"
> としてtimeoutとなった場合に於いては
> 次にWait文をいれると比較(受信?)は
> どこからされますか?二つ目のabcからですか?

 タイムアウトとなった場合、それまでに受信した文字列はすべてwait対象から無視
されます。

 wait文で何か文字列にヒットした場合には、その文字列の直後から次のwait系文の
マッチングが開始されますが、タイムアウトした場合はまったく別です。


00381 02/06/27 18:26 RE:00377 wait文
投稿者 : ぴぴ   コメントを投稿する

直接関係ないかもしれませんが、以前に私が遭遇した事象を
参考にお知らせします。

以下のように、前段でsendとwaitの対応がきちんと取れておらず、
send行を連続で処理するようなスクリプトにしてしまった場合には、
date/who am i/ls -lをsendした後に受信したws1%プロンプトが
catの前のwaitとして処理され、あたかもwaitが機能していないような
感じで立て続けに画面上に表示されてしまいます。

send "telnet 192.168.1.1" + "^M"
wait "login:"
send "abcdefg"+"^M"
wait "Password:"
send "abcdefgh"+"^M"

send "date " + "^M"
send "who am i" "^M"
send "ls -l" + "^M"
wait "ws1%"
send "cat aaa.sh" + "^M"
wait "ws1%"
send "cat bbb.sh" + "^M"
wait "ws1%"
send "cat ccc.sh" + "^M"


---------------------------------------------------------------
画面イメージ
ws0%telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.


SunOS 5.6

login: abcdefg
Password: 
Last login: Thu Jun 27 17:31:06 from 192.168.xxx.xxx
Sun Microsystems Inc.   SunOS 5.6       Generic August 1997
ws1%Thu Jun 27 17:31:57 GMT 2002
ws1%abcdefg     pts/31       Jun 27 17:31   (xxxxxxxx)
ws1%total 82874
ws1%cat aaa.sh   
cat bbb.sh       (注:cat bbb.shが即時実行されているように見える)
cat ccc.sh       (注:cat ccc.shが即時実行されているように見える)
#!/bin/csh       (注:aaa.shの内容の先頭行)

ws1%#!/bin/csh   (注:bbb.shの内容の先頭行)

ws1%#!/bin/csh   (注:ccc.shの内容の先頭行)

ws1%


00382 02/06/27 21:09 (発言者削除)
投稿者 : akihihi



00383 02/06/27 21:19 RE:00380 wait文
投稿者 : akihihi   コメントを投稿する

処理内容を理解しました。
ってことは、受信した内容をいっさいチャラにして、それ以降
の文字をwait対象としたい場合はtimeoutを意図的に発生させ
ればいいってわけですね。


00384 02/06/27 21:27 RE:00381 wait文
投稿者 : akihihi   コメントを投稿する

同じような壺にはまってたとおもいます。
Wait分で一度ヒットすれば、次回はどこから比較されるかが
みえてませんでした。


新規に投稿する