2

特定の bash コマンドについて、完了後にローカルで実行するとシェルが解放されましたが、リモートで実行するとシェルが次のようにハングします。

[user@host ~]$ ruby bin/remote_control.rb  server start_server1
Running /home/server_manager.sh start_server ... wait

[]

ruby と NET::SSH を使用してこのコマンドをリモートで呼び出すと、ctrl+C を押してシェル プロンプトを再び利用できるようにする必要があり、Enter キーを押しても機能しません。

繰り返しますが、リモート スクリプト/コマンド /home/server_manager.sh は、ローカルで呼び出されたときにこの動作をしません。

端末を解放するには、スクリプトの構文は次のとおりです。

バックグラウンドで実行しようとしています
`commmand &` 2>&1 | echo "\n"

上記のスクリプトを呼び出すには、以下の Ruby コードを使用します。

Net::SSH.start(@hostname, @username, :password => @password) do |ssh|

  channel = ssh.open_channel do |ch|
     ch.exec @cmd do |ch, success|
        raise "Could not execute command: #{cmd}" unless success

        ch.on_data do |c, data|            
           begin
              if !data.nil?  then
                  print data
              else 
                  exit
              end        
           rescue SystemExit
              puts "Rescued a SystemExit exception"
           end               
        end

        ch.on_extended_data do |c, type, data|
           begin
              if !data.nil?  then
                  print data
              else 
                  exit
              end        
           rescue SystemExit
              puts "Rescued a SystemExit exception"
           end   
        end

        ch.on_eof do |ch|
           puts "Cmd finished with success: #{@cmd}"
           $LOG.info("Cmd finished with success: #{@cmd}")
        end
        ch.on_close { puts "Done!" }
     end
  end
 channel.wait

 ssh.loop
end

しかし、私は今まで成功していません。シェルを常に解放するために、このコードに追加する必要があるもの。

4

0 に答える 0