2013-12-19 67 views
0

我想从我的Rails应用程序运行一个shell脚本。该脚本通过net-ssh Gem在远程服务器上启动。这里是我的代码:登录到远程系统后从rails应用程序运行shell脚本

Net::SSH.start('localhost', 'user', :password => '1234', :port => port) do |session| 
    session.exec!("#{Rails.root}/script/myscript") 
end 

我已检查脚本存在于我的本地应用程序中。脚本大约需要1个小时才能完成。我有两个问题:

  1. 这样做是正确的吗?
  2. 如何在后台运行脚本?

回答

1
  1. sample doc说,简单,而且相当正确的方式来运行Net::SSH会话如下:

    HOST = '192.168.1.113' 
    USER = 'username' 
    PASS = 'password' 
    
    Net::SSH.start(HOST, USER, :password => PASS) do| ssh | 
        result = ssh.exec! 'ls' 
        puts result 
    end 
    

    我建议至少通过shell环境传递密码参数,不要将其存储在脚本中。您也可以使用micro-optparse gem通过命令行传递其他参数。所以它可能是如下:

    require 'micro-optparse' 
    
    options = Parser.new do |p| 
        p.banner = "This is a fancy script, for usage see below" 
        p.version = "fancy script 0.0 alpha" 
        p.option :host, "set host", :default => 'localhost' 
        p.option :host, "set user", :default => '' 
    end.parse! 
    
    Net::SSH.start(options[ :host ], options[ :user ], :password => ENV[ 'PASSWORD' ]) do| ssh | 
        result = ssh.exec! 'ls' 
        puts result 
    end 
    

    而且运行命令行:

    $ bundle exec ./1.rb --host=111.ru --user=user 
    {:host=>"111.ru", :user=>"user"} 
    

    当然可以以同样的方式来添加:port参数的支持。

    result = ssh.exec! "nohup #{Rails.root}/script/myscript" 
    
0
  1. 为什么不应该是正确的方式?
  2. 要在后台运行一个shell脚本,追加&到命令

例如:

session.exec!("#{Rails.root}/script/myscript&") 
+0

可以将轨道服务器上运行的效果:

  • 使用nohupscreen utitilies为在Linux服务运行的脚本? – user2622247

  • +1

    您的shell脚本是一个单独的进程,因此不会,只要您的shell脚本不会使整个计算机停止运行。 –

    +0

    嗨尝试,但没有工作我也尝试'session.exec!(“sh#{Rails.root}/script/myscript&”)'我错过了什么 – user2622247

    相关问题