2013-02-06 81 views
4

在我的应用程序中,我想在指定的时间后终止我的SSH连接的exec!命令。执行Net-ssh超时?

我发现:timeoutNet::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})这样的东西。也许有一些内置函数来实现这个功能?

回答

7

我不知道这是否会真正的SSH环境中工作,但红宝石本身具有超时方法:

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

这将提高Timeout::Error 60秒后。检出the docs

1

我不认为在net/ssh中有一种原生的方式。请参阅the code,该选项没有附加参数。

一种方法是在您调用的命令中处理超时 - 请参阅this answer on Unix & Linux SE

我认为你的方式更好,因为你不会在你连接的系统中引入外部依赖。

0

ConnectTimeout选项(的〜/ .ssh/config中,在/ etc/ssh_config中,...)是什么我所做的是有一个线程正在进行事件处理。然后,我循环播放指定的秒数,直到频道关闭。如果在这段时间过后,频道仍然打开,然后关闭它并继续执行。