我在ruby on rails并使用net-ssh gem ssh到另一台机器,运行一些脚本,将脚本的输出重新导入rails,然后在我的站点上提供输出。这需要发生很多,事实上它是我网站的核心。
脚本本身只需要很少的时间,但响应的时间范围在瞬间到15秒之间。 SSH握手需要不同的时间。
这是我执行ssh的ruby代码:
res = []
Net::SSH.start( host, user, :password => pass ) do |ssh|
# execute container
ssh.exec("run script") do |ch, stream, data|
res.push(data)
end
end
res = res.join("")
render text: res
如何让这种速度超快?
我想知道我是否应该始终保持ssh连接打开,并在每次需要运行脚本时添加新线程(这将是很多)。我见过人们谈论ControlMaster,但不知道如何做到这一点。
答案 0 :(得分:0)
如果这是您网站的核心,您可能不想依赖SSH和exec。
另一种方法是在外部主机上使用Ruby / Rails而不是SSH,并通过更标准的Web API或像zeromq这样的消息传递系统将作业直接推送到Ruby。创建一致的Service-oriented architecture。
否则,您应该将来自Ruby的SSH连接保持为background daemon中的长时间运行任务,然后通过IPC(例如zeromq或http或简称数据库)将作业推送到它,然后等待响应。然后,您只需要在远程主机上为每个请求启动脚本。