プロが教えるわが家の防犯対策術!

お世話になります。

下記のようにマクロを記述して、コマンドの戻り値で判定を行い
異常時にダイアログを表示させようとしています。

sendln '<コマンド>'
wait 'root@'
sendln 'echo "=== STATUS $? ==="'
wait 'root@'
recvln
recvln
strcompare inputstr '=== STATUS 0 ==='
if result!=0
messagebox 'Error' param1
end

こちらを実行すると、<コマンド>の内容に依って下記悪い実行例のように
<コマンド>のあとのwaitが効かず、<コマンド>が終わる前にechoが実行されたような
動きをしており正しく動作しない場合があります。

☆悪い実行例
[root@ ~]# <コマンド>
echo "=== STATUS $? ===
[root@ ~]# echo "=== STATUS $? ===
=== STATUS $1 ===
[root@ ~]

☆良い実行例
[root@ ~]# <コマンド>
[root@ ~]# echo "=== STATUS $? ===
=== STATUS $1 ===
[root@ ~]

常に良い実行例のように、<コマンド>が終わってからechoするようにしたいのですが
どのように修正すればいいでしょうか?
なお、timeoutについてはマクロ中で設定していないのでタイムアウトしない認識でおります。
また、悪い実行例のパターンで下記のようにしてwaitの戻り値を拾ったところ1となっていました。

sendln '<コマンド>'
wait 'root@'
messagebox result param1
sendln 'echo "=== STATUS $? ==="'

以下、試して駄目だったことです。
・同期モードの使用
setsync=1、およびtimeout=60をマクロの前半部分に記載。
特に変化はなし。
・<コマンド>のあとのwaitを2つ重ねる
<コマンド>の内容によって、うまく言ったようにみえるパターンと
waitの無限待ちになるパターンの両方あり。
<コマンド>の内容に依存するのか、タイミング問題で偶々うまく言ったようにみえたのか
判断がつかないため保留中。
・<コマンド>の後にpause 1を入れる
<コマンド>の実行速度が常に一定ではないので、pause 1では間に合わない場合がある。
適切なpause時間の見積りが困難なため保留。
・戻り値の判定をシェルスクリプトなどで行う
 顧客要件により没

以上、よろしくお願い致します。

A 回答 (1件)

現象からすると、悪い例では


 [root@ ~]# <コマンド>
のroot@ をwaitで検出してるように想います。

http://ttssh2.sourceforge.jp/manual/ja/macro/com …
でバッファをクリアするのはでょうでしょうか?
    • good
    • 3
この回答へのお礼

回答有難うございます。

>バッファーの中に古い文字がたまっているために受信文字を処理するコマンドの結果が予期しないものになることがあり、flushrecv コマンドによってそれを防ぐことができる。

こういう仕組みなのですね、勉強になりました。

まだ動作の確認がとれておりませんがひとまずお礼まで。

お礼日時:2014/09/13 21:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A