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