2017-06-28 83 views
1

我使用Ruby Net/SSH啓動nohup遠程腳本。Ruby 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 

所有stdoutstderr保存到遠程計算機上的文件。

是否有可能獲得遠程腳本的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命令

編輯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