我正在使用Ruby Net / SSH启动nohup远程脚本。
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
所有stdout
和stderr
都会保存到远程计算机上的文件中。
是否可以获取远程脚本的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 :(得分: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