これは興味深い状況であり、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