Проблема с остановкой канала Erlang SSH - PullRequest
2 голосов
/ 18 марта 2010

ПРИМЕЧАНИЕ: Я буду использовать ssh_sftp канал в качестве примера здесь, но я заметил то же самое поведение при использовании разных каналов.

После запуска канала:

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

(где cm - мой диспетчер соединений ), я выполняю операцию через канал. Скажи:

ssh_sftp:write_file(ChannelPid, FilePath, Content),

Затем я останавливаю канал:

ssh_sftp:stop_channel(ChannelPid),

Поскольку, насколько мне известно, канал реализован как gen_server, я ожидал, что запросы будут секвенированы.

Что ж, после небольшой трассировки я заметил, что канал каким-то образом остановлен до , запись файла завершена, и результат операции передается через канал. Таким образом, ответ не передается через канал, поскольку канал больше не существует.

Если я не остановлю канал явно, все будет нормально, и запись файла (или любая другая операция, выполненная через канал) будет завершена правильно. Но я бы предпочел не оставлять открытые каналы. С другой стороны, я бы предпочел избегать реализации собственного обработчика получения, чтобы дождаться результата, прежде чем канал может быть остановлен.

Я, наверное, здесь упускаю что-то тривиальное. У вас есть идея, почему это происходит, и / или я могу это исправить?

Я повторяю, ssh_sftp это просто пример. Я использую свои собственные каналы, реализованные с использованием существующих каналов в приложении Erlang SSH в качестве шаблона.

Ответы [ 2 ]

1 голос
/ 07 июня 2013

У меня была похожая проблема с ssh_connection: exec / 4. Проблема в том, что все эти одноуровневые модули ssh (ssh_connection, ssh_sftp и т. Д.), Похоже, ведут себя асинхронно, поэтому закрытие самого канала ssh отключит текущее действие.

Варианты:

1) не закрывать соединение: это может привести к утечке ресурсов. Цель моего вопроса здесь

2) После sftp введите функцию мониторинга, которая ожидает, отслеживая файл, который вы передаете на удаленный сервер (проверка контрольной суммы). Это может быть основано на ssh_connection: exec и опросе файла, который вы передаете. Как только контрольная сумма соответствует ожидаемой, вы можете освободить основной модуль

1 голос
/ 01 ноября 2012

Как вы можете видеть в ssh_sftp.erl , он принудительно убивает канал через 5 секунд тайм-аута с помощью exit (Pid, kill) , который прерывает процесс независимо от того, обрабатывает ли он что-то или нет .

Связанные цитаты из erlang man :

Если причиной является уничтожение атома, то есть при вызове exit (Pid, kill), в Pid посылается необратимый сигнал выхода, который безусловно завершит работу с уничтоженной причиной выхода.

...