0

我想从我的 Rails 应用程序运行一个 shell 脚本。该脚本通过net-sshGem 在远程服务器上启动。这是我的代码:

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

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

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

2 回答 2

1
  1. 示例文档说运行会话的简单且非常正确的方法如下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-optparsegem通过命令行传递其他参数。所以它可能如下:

    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可以以相同的方式添加对参数的支持。

  2. 使用nohupscreen实用程序在 linux 中将脚本作为服务运行:

    result = ssh.exec! "nohup #{Rails.root}/script/myscript"
    
于 2013-12-19T14:09:33.420 回答
0
  1. 为什么不应该是正确的方式?
  2. 要在后台运行 shell 脚本,请附加&到命令

例如:

session.exec!("#{Rails.root}/script/myscript&")
于 2013-12-19T11:32:31.747 回答