Net-SSH тайм-аут для выполнения?

В моем заявлении я хочу прекратить exec! Команда моего соединения SSH через указанное количество времени.

Я нашел :timeout для Net::SSH.start Команда, но следуя документации, это только для первоначального подключения. Есть ли что-то эквивалентное для exec команда?

Мое первое предположение было бы не использовать exec! так как это будет ждать, пока команда не закончится, но с помощью exec и окружить вызов циклом, который проверяет состояние выполнения при каждой итерации и завершается ошибкой по истечении заданного промежутка времени.

Как то так, если я правильно понял документацию:

server = NET::SSH.start(...)

server.exec("some command")

start_time = Time.now
terminate_calculation = false

trap("TIME") { terminate_calculation = ((Time.now - start_time) > 60) }
ssh.loop(0.1) { not terminate_calculation }

Однако это кажется мне грязным. Я ожидаю что-то вроде server.exec("some command" { :timeout=>60}), Может быть, есть какая-то встроенная функция для достижения этой функциональности?

4 ответа

Решение

Я не уверен, будет ли это работать в контексте SSH, но у самого Ruby есть метод тайм-аута:

server = NET::SSH.start ...
timeout 60 do
  server.exec! "some command"
end

Это поднимет Timeout::Error через 60 секунд. Проверьте документы.

Я не думаю, что есть собственный способ сделать это в net / ssh. Посмотрите код, для этой опции нет дополнительных параметров.

Один из способов заключается в обработке таймаутов в вызываемой вами команде - посмотрите этот ответ в Unix & Linux SE.

Я думаю, что ваш путь лучше, так как вы не вводите внешние зависимости в системах, к которым вы подключаетесь.

Я сделал поток, который обрабатывает события. Затем я зацикливаюсь на определенное количество секунд, пока канал не закроется. Если по истечении этих секунд канал все еще остается открытым, закройте его и продолжите выполнение.

Другое решение - установить опцию ConnectTimeout в файлах конфигурации OpenSSH (~/.ssh/config, /etc/ssh_config, ...)

Проверьте больше информации в

https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/config.rb

Другие вопросы по тегам