注意:我将使用 ssh_sftp
此处以 channel 为例,但我注意到使用不同 channel 时的行为相同。
开启 channel 后:
{ok, ChannelPid} = ssh_sftp:start_channel(State#state.cm),
(其中 cm 是我的连接管理器),我正在通过 channel 执行操作。说:
ssh_sftp:write_file(ChannelPid, FilePath, Content),
然后,我要停止 channel :
ssh_sftp:stop_channel(ChannelPid),
因为,据我所知, channel 是作为
gen_server
实现的。 ,我期待请求是按顺序排列的。好吧,经过一番跟踪,我注意到 channel 不知何故停止了之前 文件写入完成,通过 channel 发送操作结果。作为结论,响应不会通过 channel 发送,因为 channel 不再存在。
如果我没有明确停止 channel ,一切正常,并且文件写入(或通过 channel 执行的任何其他操作)正确完成。但我宁愿避免留下开放的 channel 。另一方面,我宁愿避免实现我自己的接收处理程序来等待结果,然后才能停止 channel 。
我可能在这里遗漏了一些微不足道的东西。你知道为什么会发生这种情况和/或我可以解决它吗?
我再说一遍,
ssh_sftp
只是一个例子。我正在使用我自己的 channel ,使用 Erlang SSH 应用程序中的现有 channel 作为模板来实现。
最佳答案
正如您在 ssh_sftp.erl 中看到的那样它在 5 秒超时后用 强制终止 channel 退出(Pid,杀死)无论它是否正在处理某些东西,它都会中断该过程。
来自erlang man 的相关报价:
If Reason is the atom kill, that is if exit(Pid, kill) is called, an untrappable exit signal is sent to Pid which will unconditionally exit with exit reason killed.
关于erlang - 停止 Erlang SSH channel 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469896/