2013-12-19 68 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

    相關問題