sessionブロックの使い方について
以下参考に記述してるのですが、うまくいかないことがあり、確認させてください。
https://support.kompira.jp/column/session_block/
環境:Kompira1.6.5
{ session s |
[s.send: "date\n"] ->
<s> ->
[s.send: "export LANG=C; date\n"] ->
<s> ->
[s.send: "date\n"] ->
<s>
}
上記のサンプルの例は問題なく動作するのですが、
4行目の[s.send: "export LANG=C; date\n"] を[s.send: "export LANG=C\n"] に変更すると、そこで止まってしまい、待ちから返ってきません。
やりたいことは、この例のようにセッション内で環境変数を設定(複数あり)して、その後の複数のコマンドをその環境変数下を使って実行することです。
上記のような環境変数設定はできないでしょうか?(指定方法が誤っておりましたらご指摘いただければ幸いです
また、下記点も確認させていただきたく思います
・あるコマンドで150行程度の出力があるものがあります。
ジョブフローで ["command"] -> print($RESULT) とすると、コンソールにはコマンドの実行内容とprintで出した分で通常どおり、計300行出力されるのですが、
sessionブロックで実施すると、コマンドの実行内容の出力で切れ、その後のprint出力や、次のコマンドがコンソールに出力されてきません
(ジョブフロー上は完了になりますが、ジョブフロー内で指定したコンソールの出力がすべて出てこない状態です。ページリロードしても変わらずです)
こちら何か制限がありますでしょうか?
・上記に関して、可能であれば、コンソールへのコマンド実行結果出力を抑制したいのですが、そのような設定はできますでしょうか
・s.send文で実行したコマンドの戻り値は、そのすぐあと(sessionブロック内)で、$STATUSでとれますでしょうか?(異常となるコマンド実行しても0でかえってきており、同じコマンドをサーバのコンソールでkompiraユーザで実行したときの戻り値と異なっていたため)
・当件は__node__ 等指定せず、ローカル環境上で試しています。マニュアルに「session ブロックは、リモートサーバとのセッションを開始します。」とありますが、ローカル(Kompiraサーバ上のコマンド)でも同じように使える理解であってますでしょうか
-
正式なコメント
セッションチャネル <s> は、コマンドを実行した際の標準出力の結果が、データとして蓄えられます。
したがいまして、環境変数の設定は標準出力を伴わないため、セッションチャネル<s> からの読み出し時にブロックされてしまうことになります。
環境変数の設定とコマンド実行を分けたい場合は、以下のようにしてみてください。
[s.send: "export LANG=C\n"] ->
[s.send: "date\n"] ->
<s> ->
print($RESULT)コメントアクション -
コマンドの出力結果が大量の場合、セッションチャネル<s> からの読み出しは一回では完了しない場合があります。
したがって、出力が150行程度あるコマンドの結果をセッションチャネルから読み込むには、
[s.send: "command\n"] ->
[command_result = ''] ->
{ while true |
<s: timeout=5> =>
[status = $STATUS, result = $RESULT] ->
{ if status | break } -> # 出力が途切れたので読み込みループを抜ける
[command_result = command_resut + result]
} ->
print(command_result)のようにする必要があります。
サインインしてコメントを残してください。
コメント
5件のコメント