对于特定命令,使用Net :: SSH在远程SSH命令执行中挂起ruby

时间:2012-03-22 09:25:12

标签: ruby

我正在尝试通过ruby使用连接远程ssh服务器  Net :: SSH.It对我提供的所有命令都很好  脚本,我能够读取命令的输出  成功。但是,当我使用下面的命令时,它会陷入困境  SSH.exec!(cmd)和控件不会从该行返回。只有我  在命令行中单击Ctrl + c,脚本即将结束。命令  是./wcsadmin.sh start - >这用于启动我的过程  远程服务器中的应用程序

请找到我的ruby脚本的以下代码片段:

Net::SSH.start(host, username, :password => password) do |ssh|
puts 'before exit'
output = ssh.exec!(/opt/wcsadmin.sh start)
puts 'Executed command'

当我手动执行命令时输出:

  

[root @ test bin]#。/ wcsadmin.sh start

     

启动网络控制系统......

     

这可能需要几分钟...... stty:标准输入:参数无效

     

网络控制系统已成功启动。

     

启动SAM守护程序...完成。启动DA守护程序...启动DA syslog   守护进程......开始

如果我使用ssh.exec('./ wcsadmin.sh start'),唯一的区别就是  以上输出正在打印,但程序仍然没有结束.I  需要通过按ctrl + c手动结束它。当我在谷歌搜索我  可以找到你可以使用

  

nohup命令('nohup /opt/wcsadmin.sh start> /tmp/teststartserver.log 2>& 1')

跳过挂断信号并尝试相同。这也将输出写入teststartserver.log但是  被绞死了。任何人都可以帮我解决这个问题吗?

提前致谢!

谢谢,Meena

1 个答案:

答案 0 :(得分:0)

如果命令本身没有立即返回,那么SSH.exec!将阻止进一步执行,直到命令返回。如果由于某种原因你失去远程联系,那么SSH.exec!可能不知道你已经失去了连接,它将继续阻止。

您可以尝试将命令放在后台:

output = ssh.exec!('/opt/wcsadmin.sh start &')

或者查看该命令的文档,也许它有某种--no-wait选项,允许它立即返回,即使它仍在工作。