2017-06-28 8 views
1

Ruby Net/SSHを使用してnohupリモートスクリプトを起動します。すべてのstdoutstderrRuby Net/SSH exec - リモートプロセスのpidを取得する

Net::SSH.start(ip_address, user, options) do |ssh| 
    script = File.join(remote_path, 'run_case.py') 
    cmd = "nohup python #{script} #{args} < /dev/null &" 
    ssh.exec(cmd) 
end 

は、リモートマシン上のファイルに保存されます。

リモートスクリプトのPIDを取得して、必要に応じて強制終了できるのですか?

編集1: 私はこのスクリプトを推奨するように変更しました。

Net::SSH.start(ip_address, user, options) do |ssh| 
    script = File.join(remote_path, 'run_case.py') 
    cmd = "nohup python #{script} #{args} < /dev/null & echo $! > save_pid.txt" 
    ssh.exec(cmd) 
    pid = ssh.exec!("cat save_pid.txt") 
    puts mesh_pid 
end 

ファイルが見つかりません。これはファイルがまだ存在しないためですか?可能であれば、sleepコマンドを回避することをお勧めします。

EDIT 2:多分これはエレガントではないが動作します。 2回目のsshセッションを作成し、pgrepを使用しました。

Net::SSH.start(ip_address, user, options) do |ssh| 
    script = File.join(remote_path, 'run_case.py') 
    cmd = "nohup python #{script} #{args} < /dev/null &" 
    ssh.exec(cmd) 
end 

Net::SSH.start(ip_address, user, options) do |ssh| 
    cmd = "python #{script} #{args}" 
    mesh_pid = ssh.exec!("pgrep -f '#{cmd}'") 
    puts mesh_pid 
end 
+0

なぜ投票が遅れますか? – Rojj

+0

あなたの編集が意味をなさないため、私はダウン投票しました。ここに戻ってくる前にコードで一瞬でも見ましたか? – hek2mgl

+0

私は参照してください。はい、私は最初のコマンドの変更を忘れていました。ダミーコピー&ペースト。 – Rojj

答えて

2

次のようにして、PIDを決定する(そして、それをファイルに保存)することができるはずです:スクリプトで

Net::SSH.start(ip_address, user, options) do |ssh| 
    script = File.join(remote_path, 'run_case.py') 
    cmd = "nohup python #{script} #{args} < /dev/null & echo $! > save_pid.txt" 
    ssh.exec(cmd) 
end 

を、$!実行された最後のプロセスのPIDを表します。プロセスを強制終了する必要がある場合は、

kill -9 `cat save_pid.txt` 
rm save_pid.txt 
+0

これで、今度はpidを得ることができますが、接続を手動で終了しない限り、ハングします。あなたの端末で 'nohup sleep 1000&'を試して見てください – hek2mgl

関連する問題