erlang - 停止 Erlang SSH channel 的问题

标签 erlang ssh sftp

注意:我将使用 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/

相关文章:

oracle - SSH Xforwarding 更改用户帐户

.net - 在批处理脚本中使用 Powershell 的 SFTP

node.js - nodejs从sftp下载文件

erlang - OTP 行为 : gen_fsm; gen_event. 实际例子?

Erlang位语法变量问题

git push heroku master 权限在 VISTA 上被拒绝

linux - 如何限制反向 SSH 隧道端口?

java - 将 Guardian 文件上传到 Tandem/Compaq/HPE NonStop 服务器

c++ - 通过端口从 Erlang 调用 C 函数的最快和最简单的方法是什么?

erlang - Chicago Boss CSRF 和变量传递到模板文件