Kompiraから他の機器上で対話的にコマンドを実行し、その出力結果を取得したい

回答済み

コメント

1件のコメント

  • 正式なコメント
    Kompiraサポートチーム

    お問い合わせありがとうございます。

     

    ジョブフローが応答待ちになってしまう問題について

    <s ?? g'* tmp]$'> => # ★この行で応答待ちになってしまう

    上記部分でジョブフローが応答待ちになってしまうとのことですが、

    セッションブロックでは送受信データに改行コードが含まれる場合がありますので、例えば下記のようにして、マッチする範囲を広げてみるとよいかもしれません。

    <s ?? g'* tmp]$ *'> =>

     

    コマンドの実行結果が取得できない問題について

    > また、この応答待ちの部分を省略し、コマンド実行結果の取得のみを試したところ、

    > 出力結果をうまく変数に格納することができませんでした。

     

    こちらの問題は、lsコマンドを実行した後すぐにセッションブロックを抜けてしまっていることが原因かと思われます。

    例えば、下記のようにプロンプトの表示を待つ処理を入れていただくと、期待されている結果が取得できるかと思います。

    { session s |

        [s.send: 'ls -al\n'] -> # コマンドを実行

        <s ?? g'* ]$*'> => # プロンプトが表示されるまで待ってから
        [ret = $RESULT] -> # 結果を取得
        print(ret)

    }

     

    ただし、上記の方法ではコマンドの実行結果に「 g'* ]$*’」の条件を満たす文字列が含まれる場合、変数retに格納される文字列は、出力結果全体のうち当該文字列より前の部分に限定されてしまいます。

    これを回避するためには、応答待ちにタイムアウトを設定し、「コマンド実行後、一定時間出力がなくなるまでの結果を結合する」方式を使用するのがよいかと思います。

    |timeout = 5|

    [__node__=./testnode] ->
    [__use_pty__ = true] ->

    [ret = ''] ->

    { session s |

        [s.send: 'cd /tmp\n'] ->
        <s ?? g'* tmp]$*:timeout> ->

        [s.send: 'ls -al\n'] -> # コマンドを実行
        {while true|

            <s: timeout> =>
            {if $STATUS | break } -> # タイムアウトしたらループを抜ける
            [ret = ret + $RESULT] # 出力を連結

        }

    } ->

    print(ret)

    <s ?? >などのイベントを待つジョブにタイムアウトを指定しておくと、期待したプロンプトが得られなくてもジョブフローが完全には停止しないような制御が可能となります。

     

    > 初歩的な質問で恐れ入りますが、よろしくお願いいたします。

    セッションブロックはKompiraの中でも比較的難易度の高い機能ですし、特に条件待ちの部分などは接続する機器の環境によって都度調整が必要な機能となります。

    うまく動かない場合は、実際に受信した文字列を確認しながらセッションブロックの構築を試してみてください。

     

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

    コメントアクション Permalink

サインインしてコメントを残してください。