ПРИМЕЧАНИЕ: В качестве примера я использую канал ssh_sftp
, но я заметил такое же поведение при использовании разных каналов.Проблема остановки Erlang SSH-канала
После запуска канала:
{ok, ChannelPid} = ssh_sftp:start_channel(State#state.cm),
(где см мой Connection менеджер), я выступаю операцию через канал. Скажи:
ssh_sftp:write_file(ChannelPid, FilePath, Content),
Затем я останавливая канал:
ssh_sftp:stop_channel(ChannelPid),
Так, насколько я знаю, канал выполнен в виде gen_server
, я ожидал, что запросы будут последовательно;.
Ну, после небольшого отслеживания я заметил, что канал каким-то образом остановлен до запись файла завершена, и результат операции отправляется по каналу. Как вывод, ответ не отправляется через канал, так как канал больше не существует.
Если я не останавливаю канал явно, все работает нормально, и запись файла (или любая другая операция, выполняемая через канал) выполняется правильно. Но я бы предпочел не оставлять открытые каналы. С другой стороны, я бы предпочел не выполнять собственный обработчик приема, чтобы дождаться результата до остановки канала.
Возможно, у меня, наверное, нет ничего тривиального. У вас есть идея, почему это происходит и/или я могу это исправить?
Повторяю, ssh_sftp
- всего лишь пример. Я использую свои собственные каналы, реализованные с использованием существующих каналов в приложении Erlang SSH в качестве шаблона.
Я посмотрел на 'ssh_sftp.erl', но я не вижу, как write_file будет _not_ ждать, пока файл будет правильно написан. Случайное предположение: проверьте возвращаемое значение из ssh_sftp: write_file ... – legoscia