0

Rails アプリケーションからシェル スクリプトを実行したいと考えています。net-sshスクリプトは、 Gemを介してリモート サーバーで開始されます。これが私のコードです:

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

スクリプトがローカル アプリケーションに存在することを確認しました。スクリプトの完了には約 1 時間かかります。2 つの質問があります。

  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
    

    シェル環境を介して少なくともパスワード引数を渡して、スクリプトに単純に保存しないことをお勧めします。また、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. nohupまたはユーティリティを使用screenして、Linux でスクリプトをサービスとして実行します。

    result = ssh.exec! "nohup #{Rails.root}/script/myscript"
    
于 2013-12-19T14:09:33.420 に答える
0
  1. なぜそれが正しい方法であってはならないのですか?
  2. バックグラウンドでシェルスクリプトを実行する&には、コマンドに追加します

例えば:

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