wait文No.00362
akihihi さん 02/06/18 17:53
 
スクリプトのwait文が急に動作しなくなって、send文が即時実行されてしまいます。
なにか原因はありませんか?下記のようなパターンでプロンプトをまって
コマンドを発行してます。何か特殊文字等でwait文が機能しなくなるで
しょうか?

 wait  "DAISUB"
  send  "cat da2tux.log" + "^M"

--以下ログ--------------------------------------

DAISUB [33]: cat da2snm.log   ・・・・@sendした後wait "DAISUB"として文字
をまつ
cat da2po.log          ・・・・A以下3行ともwaitしたあとコマンド
を送信するはずが、かってに送信される
cat da2lk2.log          
cat da2eco1.log         
    root  1809     1  0  8月  6  ?        297:47 /opt/xxxx   ・・・・@の
catコマンドの表示
    root  1821     1  0  8月  6  ?        467:26 /opt/xxxx
    root  1815     1  0  8月  6  ?         0:00 /opt/xxxx
    root  1845  1844  0  8月  6  ?        622:07 /opt/xxxx
    root  1844     1  0  8月  6  ?        138:23 /opt/xxxx
    root  1837     1  0  8月  6  ?        54972:08 /opt/xxxx
    root  1794     1  0  8月  6  ?        35:17 /usr/xxxx
 
========= DAISUB SNMP    7/7   OK =========
 
------------------------------
   2002年06月18日 17時37分37秒
------------------------------
DAISUB [34]: cat da2po.log    ・・・・ Bwait文がまた動作しだしてる

[ ]
RE:00362 wait文No.00363
秀まるお2 さん 02/06/19 10:25
 
 wait文が動作しなくなる原因としては、timeout文の実行によってタイムアウト値
が変更された可能性が高いと思います。

 wait文の前に

    timeout 0

 を入れれば直ると思います。

[ ]
RE:00363 wait文No.00364
akihihi さん 02/06/20 10:00
 
akihihiです。回答ありがとうございます。
 timeout文ですが変更はしてますが、それもかなり前でしてます。それが
有効になってないはずがありません。
 

> wait文が動作しなくなる原因としては、timeout文の実行によってタイムアウト値
>が変更された可能性が高いと思います。

 変更されたとはどういう意味でしょうか?タイムアウトは10秒とかに
しており、その間で3回のwaitが無効になり、即座に3つものsend文
が実行されるとは考えられないのです。
 なんらかの原因でwait文が動作不能になる事象があるとの意味でしょうか?とりあ
えずはtimeout 0にはしてみましたが・・・

[ ]
RE:00364 wait文No.00365
秀まるお2 さん 02/06/21 13:58
 
> 変更されたとはどういう意味でしょうか?タイムアウトは10秒とかに
>しており、その間で3回のwaitが無効になり、即座に3つものsend文
>が実行されるとは考えられないのです。

 スクリプトのどこかで、例えば「millitimeout 1」が実行されたりすると、タイム
アウトが0.01秒になり、結果としてwait文を一瞬で追加してしまうことがあると思っ
たんですが、そういう訳ではないとしたら、もう1つの可能性は、秀Term用のアドイ
ンソフト側で何か細工している可能性です。

 phone.txtの排他制御のエラーが発生する件も含めて、何かアドインソフトが動作
しているせいでおかしくなっているんじゃないかという気がします。

[ ]
RE:00365 wait文No.00366
akihihi さん 02/06/22 00:28
 
アドイン?
秀termしかいれてません、アドインをつかってるつもりはないのですが、その中
に付属してるのですか?

[ ]
RE:00366 wait文No.00367
秀まるお2 さん 02/06/23 10:21
 
>秀termしかいれてません、アドインをつかってるつもりはないのですが、その中
>に付属してるのですか?

 ご自身でインストールした覚えが無いならそういう類の物は入ってないんだと
思います。

 んじゃ、やはり秀Term固有の問題かと思いますが、一応、timeoutの値が狂っ
た以外には今ひとつ原因は思いつかないです。

 ということで、timeout文を入れてもなお動作がおかしかったらまた連絡くだ
さい。

[ ]
RE:00367 wait文No.00368
akihihi さん 02/06/23 23:45
 
はい。でも、どう、何をお知らせすればよいか・・・???

[ ]
RE:00368 wait文No.00369
秀まるお2 さん 02/06/24 16:57
 
>はい。でも、どう、何をお知らせすればよいか・・・???

 「timeout文を入れてもやはり症状は変わらない」ということならそれだけ連絡い
ただければ、それなりに調べますが…。そういうことなのやら?

[ ]
RE:00368 wait文No.00370
秀まるお2 さん 02/06/24 16:58
 
 うむ、もしダメだとしたら、念のため

    timeout 100
    message "今からwaitします。"
    wait  "DAISUB"
    message "waitしました。"

 のような形で本当にwait文が一瞬で終わってるかどうかテストして欲しいなぁと思
ったりします。

[ ]
RE:00370 wait文No.00371
akihihi さん 02/06/25 11:01
 
試してみます

> うむ、もしダメだとしたら、念のため
>
>    timeout 100
>    message "今からwaitします。"
>    wait  "DAISUB"
>    message "waitしました。"
>
> のような形で本当にwait文が一瞬で終わってるかどうかテストして欲しいなぁと思
>ったりします。

[ ]
RE:00370 wait文No.00372
akihihi さん 02/06/25 11:44
 
まず、示されメッセージ文を入れずに実行するとwait文が
有効になりません。直近の「timuoute 0」としてます

よくみてみると、おもうに、ログライトのタイミングがおか
しくないでしょうか?waitは内部的にはうまく動作してそう
な気がします。
 これのほかに、ハングアップ直前にwritelog文でログにメッセージを
記録するのですが、それも、変な位置(最後でない、サーバから
のメッセージといりくんで)に記録されます







### オリジナルスクリプトの場合 ###


DAISUB2M [33]: cat da2snm.log
cat da2po.log            −−−◆waitするも以下3行がsendされる?
cat da2lk2.log
cat da2eco1.log
    root  1809     1  0  8月  6  ?        300:48 /opt/OKIsnmpa/bin/snmpd
    root  1821     1  0  8月  6  ?        471:59 /opt/OKIsnmpa/bin/machined
    root  1815     1  0  8月  6  ?         0:00 /opt/OKIsnmpa/bin/mib2d
    root  1845  1844  0  8月  6  ?        627:43 /opt/OKIsnmpa/bin/snmpd-ora
    root  1844     1  0  8月  6  ?        139:46 /opt/OKIsnmpa/bin/snmpd-ora
    root  1837     1  0  8月  6  ?        55515:51 /opt/OKIsnmpa/bin/snmpd-tux
    root  1794     1  0  8月  6  ?        35:38 /usr/lbin/cmsnmpd
 
========= DAISUB2M SNMP    7/7   OK =========
 
------------------------------
   2002年06月25日 11時09分42秒
------------------------------
DAISUB2M [34]: cat da2po.log



### 示されたメッセージを入れると ###


DAISUB2M [33]: cat da2snm.log
    root  1809     1  0  8月  6  ?        300:48 /opt/OKIsnmpa/bin/snmpd
    root  1821     1  0  8月  6  ?        472:00 /opt/OKIsnmpa/bin/machined
    root  1815     1  0  8月  6  ?         0:00 /opt/OKIsnmpa/bin/mib2d
    root  1845  1844  0  8月  6  ?        627:44 /opt/OKIsnmpa/bin/snmpd-ora
    root  1844     1  0  8月  6  ?        139:46 /opt/OKIsnmpa/bin/snmpd-ora
    root  1837     1  0  8月  6  ?        55516:25 /opt/OKIsnmpa/bin/snmpd-tux
    root  1794     1  0  8月  6  ?        35:38 /usr/lbin/cmsnmpd
 
========= DAISUB2M SNMP    7/7   OK =========
 
------------------------------
   2002年06月25日 11時19分00秒
------------------------------
DAISUB2M [34]: cat da2po.log
O






−◆以下示されたメッセージを入れたソースリスト−−−−−−−−

;**********************
;*****      ログ表示          *****
;**********************
timeout 0
wait    "DAISUB2M"
send "cat da2ora.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2tux.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2ns.log" + "^M"

wait    "DAISUB2M"
;sleep 1


timeout 100             −−−−これらをいれました
    message "今からwaitします。"
send "cat da2snm.log" + "^M"
    wait  "DAISUB"
    message "waitしました。"


;wait    "DAISUB2M"
;sleep 1
send "cat da2po.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2lk2.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2eco1.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2erco.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2ervi.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2sysop.log" + "^M"

wait    "DAISUB2M"
;sleep 1
send "cat da2sysco.log" + "^M"

wait    "DAISUB2M"
;send "cat da2sysvi.log" + "^M"
wait    "DAISUB2M"
timeout 10
goto END                           ; ENDへジャンプ

[ ]
RE:00372 wait文No.00373
秀まるお2 さん 02/06/25 17:31
 
 中身を理解するのが困難なので、解読は途中で挫折させていただきます。

 それよりも、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)  ": "
    send "cat da2ora.log" + "^M"

 のように正確にプロンプトを待ってから送信するようにした方がいいと思います。

 全体的に、

 − 何か文字列を送ったら、そのエコーバックを待ってから次の処理をする。
 − 何か送信する場合は、プロンプトを完全に待ってから送信する。

 ってことで直してみてはどうでしょ?

[ ]
RE:00362 wait文No.00374
範子 さん 02/06/26 05:05
 
横から済みません

》スクリプトのwait文が急に動作しなくなって、send文が即時実行されてしまいます。
》なにか原因はありませんか?下記のようなパターンでプロンプトをまって
》コマンドを発行してます。何か特殊文字等でwait文が機能しなくなるで
》しょうか?

一番はじめの発言で、「急に動作しなくなって」とあったので
前は動いてたけど、秀Termのバージョンアップとか「なにかしたら」
うまくプロンプトを待てなくなった、そう解釈したのですがそれでいい
でしょうか。
 また、「なにかした」というのが発言番号00372にあるスクリプトで

》;**********************
》;*****      ログ表示          *****
》;**********************
中略

》wait    "DAISUB2M"
》;sleep 1
》send "cat da2tux.log" + "^M"

このsleep 1をコメントアウトした、ということだったり
しますでしょうか?
                             Νογικο

[ ]
RE:00374 wait文No.00375
akihihi さん 02/06/27 11:56
 
akihihiです 


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

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


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

[ ]
RE:00373 wait文No.00376
akihihi さん 02/06/27 12:10
 
指摘いただいてますように、サーバからのプロンプトが完全に返却され
文字が送信されてこないことを待つようにします。ただ一点質問があり
ます。よろしくお願いします



> 中身を理解するのが困難なので、解読は途中で挫折させていただきます。
>
> それよりも、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"


[ ]
RE:00376 wait文No.00377
秀まるお2 さん 02/06/27 16:07
 
> (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)とかも入れてあげるとなおいいです。

[ ]
RE:00377 wait文No.00378
akihihi さん 02/06/27 17:40
 
おつきあいありがとうございます。ねちっこくてすみません
文字のみで意味を伝えるの難しいです・・・。不足なのが多々ありますが・・・。



>> (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からですか?

[ ]
RE:00378 wait文No.00380
秀まるお2 さん 02/06/27 18:26
 
> これからすると上記とおなじケースで
> wait "abc"
> wait "cdf"
> としてtimeoutとなった場合に於いては
> 次にWait文をいれると比較(受信?)は
> どこからされますか?二つ目のabcからですか?

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

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

[ ]
RE:00377 wait文No.00381
ぴぴ さん 02/06/27 18:26
 
直接関係ないかもしれませんが、以前に私が遭遇した事象を
参考にお知らせします。

以下のように、前段で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%

[ ]
RE:00380 wait文No.00383
akihihi さん 02/06/27 21:19
 
処理内容を理解しました。
ってことは、受信した内容をいっさいチャラにして、それ以降
の文字をwait対象としたい場合はtimeoutを意図的に発生させ
ればいいってわけですね。

[ ]
RE:00381 wait文No.00384
akihihi さん 02/06/27 21:27
 
同じような壺にはまってたとおもいます。
Wait分で一度ヒットすれば、次回はどこから比較されるかが
みえてませんでした。

[ ]