Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中存储ssh连接_Ruby On Rails_Ruby_Caching_Ssh_Net Ssh - Fatal编程技术网

Ruby on rails 在rails中存储ssh连接

Ruby on rails 在rails中存储ssh连接,ruby-on-rails,ruby,caching,ssh,net-ssh,Ruby On Rails,Ruby,Caching,Ssh,Net Ssh,我有一个rails应用程序,需要通过ssh与几个服务器通信。我正在使用Net::SSH库,它工作得非常好。但是,我希望能够以某种方式在请求之间缓存/存储ssh连接(类似于OpenSSH多路复用) 因此,我不能将它们存储在像Memcached或Redis这样的键值存储中(因为ssh连接是不可序列化的) 我不想将它们存储在会话中,因为所有用户都要使用它们(此外,我认为它还需要可序列化) 我设法用类变量和initilizer常量来实现这一点。我知道类变量不会在服务器之间复制(在生产环境中),而且我非常

我有一个rails应用程序,需要通过ssh与几个服务器通信。我正在使用Net::SSH库,它工作得非常好。但是,我希望能够以某种方式在请求之间缓存/存储ssh连接(类似于OpenSSH多路复用)

因此,我不能将它们存储在像Memcached或Redis这样的键值存储中(因为ssh连接是不可序列化的)

我不想将它们存储在会话中,因为所有用户都要使用它们(此外,我认为它还需要可序列化)

我设法用类变量和initilizer常量来实现这一点。我知道类变量不会在服务器之间复制(在生产环境中),而且我非常确定初始值设定项常量也不会。比如:

初始值设定项:

SSH = {}
型号:

class Server
    def connection
        require 'net/ssh'
        SSH[name] ||= Net::SSH.start(ip, "root", :password => password)
    end
end
OpenSSH多路复用将非常好,但我不确定是否可以通过Net::SSH ruby库实现这一点(我又回到了将主连接存储到某个地方)


还有其他解决办法吗?或者,如果不是,那么哪一个是最不坏的呢?

要在请求之间保持SSH连接,您需要生成一个后台进程。后台进程可以打开一个管道或其他类型的句柄,您可以以可序列化的方式存储该句柄


请注意,这是一个非常重要的练习,这就是为什么我只在高级细节中描述它。

也许您可以委托给某种后台处理器,而不是尝试在请求之间共享套接字,这最终会导致痛苦和痛苦?您可以设置一个ssh隧道,并使用DRb在其中进行通信,就好像它只是一个本地网络守护进程,或者是大量网络异步作业处理守护进程中的任何一个


Redis+resque是我脑海中闪过的另一个想法,但我不确定如何实施它。所以您要说的是启动一个后台进程,它创建ssh连接并充当守护进程。。。并通过resque发送所有请求。我没弄错吧?抱歉,我对这些后台队列管理器知之甚少……如果不知道ssh连接的用途,很难给出具体的答案。如果您试图在另一台源于web请求的计算机上运行shell命令,则最好在列出的守护进程之一中将任务排队。这样,在处理请求期间,您就不会受网络延迟的支配。是的,所有shell命令都源自web请求,网络延迟是我最关心的问题。我也需要状态报告,但从我有限的研究来看,我认为这应该是可能的……真的吗?我认为所有IO连接都是不可转换的(ipc也是如此)。无论如何,处理ssh连接的后台进程似乎是最好的方法。只需要弄清楚我应该使用哪些gems/库。。有什么建议吗?