5

これは興味深い状況であり、erlang ssh モジュールの動作に焦点を当てています。Erlang のssh_connection * exec/4 * 関数が非同期で動作することが判明した問題のトラブルシューティングに数時間を費やしました。

ssh_connection:exec/4関数を発行して、完了までに数秒かかるスクリプトを実行した後、erlang プログラムで ssh 接続を閉じると、スクリプトの実行が終了します。私の期待は、ssh_connection:exec が非同期ではなく同期になることでした。

ssh_connection:exec によって呼び出されたリモート スクリプトが完了するまでの時間が不明であるため、クロージャssh:close() を発行しないことにしました。その結果を理解したい:

  • GC はある時点でそれをクリアしますか?
  • ノード全体が存在している間、それは永久に開いたままになりますか?
  • ssh_connection:exec を同期させる方法はありますか?

この問題を検証するために使用したテスト erl プログラムの例を次に示します。スクリプトとして、単純な sleep 10 (sleep 10 seconds) を実行して、実行速度の遅いプログラムをエミュレートできます。

-module(testssh).
-export([test/5]).

test (ServerName, Port, Command, User, Password) ->

    crypto:start(),
    ssh:start(),
    {ok, SshConnectionRef}                  = ssh:connect(ServerName, Port, [ {user, User}, {password, Password} , {silently_accept_hosts, true} ], 60000  ),
    {ok, SshConnectionChannelRef}           = ssh_connection:session_channel(SshConnectionRef, 60000),
    Status                                  = ssh_connection:exec(SshConnectionRef, SshConnectionChannelRef, Command, 60000),
    ssh:close(SshConnectionRef).

リモート スクリプト:

#!/bin/sh
sleep 10
4

1 に答える 1