2010-03-18 22 views
2

注意:我將使用ssh_sftp通道作爲示例,但我注意到使用不同通道時的相同行爲。停止Erlang SSH通道的問題

啓動通道後:

{ok, ChannelPid} = ssh_sftp:start_channel(State#state.cm), 

(其中釐米是我連接管理器),我通過通道進行操作。你說:

ssh_sftp:write_file(ChannelPid, FilePath, Content), 

於是,我停止通道:

ssh_sftp:stop_channel(ChannelPid), 

因爲,據我所知,該通道被實現爲gen_server,我期待的請求被sequentialized。

那麼,經過一些跟蹤後,我注意到通道在某種程度上停止了之前文件寫入完成並且操作的結果通過通道發送。作爲結論,響應不通過頻道發送,因爲頻道不再存在。

如果我不明確地停止頻道,一切正常,並且文件寫入(或通過頻道執行的任何其他操作)已正確完成。但我寧願避免留下公開渠道。另一方面,我寧願避免實現我自己的接收處理程序來等待通道停止前的結果。

我可能在這裏錯過了一些微不足道的東西。你知道爲什麼會發生這種情況,或者我可以修復它嗎?

我再說一遍,ssh_sftp只是一個例子。我使用自己的頻道,使用Erlang SSH應用程序中的現有頻道作爲模板實施。

+0

我查看了'ssh_sftp.erl',但是我看不到write_file將如何等待文件正確寫入。隨機猜測:檢查來自ssh_sftp:write_file的返回值... – legoscia 2010-03-18 16:18:57

回答

1

正如你可以看到在ssh_sftp.erl它後5秒超時有力地殺死通道與出口(PID,殺)不管是否它處理的東西或不的哪些中斷的過程。

erlang man

相關報價:

如果原因是原子殺,即如果出口(PID,殺死)被調用,一個untrappable出口信號被髮送到的Pid將無條件地退出原因退出殺死。

1

我有一個與ssh_connection:exec/4類似的問題。問題是,這些ssh兄弟模塊(ssh_connection,ssh_sftp等)全部顯示爲異步行爲,因此關閉ssh通道本身將關閉正在進行的操作。

的選項有:

1)不要關閉連接:這可能會導致資源的泄漏。我的問題的目的here

2)在sftp之後,引入監視功能,通過監視遠程服務器上傳輸的文件(校驗和檢查)來監視。這可以基於ssh_connection:exec和輪詢您正在傳輸的文件。一旦校驗和符合您的要求,您可以釋放主模塊