Ruby Net / SSH exec - 获取远程进程的pid

时间:2017-06-28 06:11:18

标签: ruby linux ssh net-ssh

我正在使用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

所有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

1 个答案:

答案 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