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

Ruby Net/SSH exec-获取远程进程的pid,ruby,linux,ssh,net-ssh,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 它抱怨找不到该文件。这是因为文件还不存在吗?如果可能的话,我宁愿避免任

我正在使用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
它抱怨找不到该文件。这是因为文件还不存在吗?如果可能的话,我宁愿避免任何
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
Net::SSH.start(ip_地址、用户、选项)do|SSH|
script=File.join(远程路径“run\u case.py”)
cmd=“nohup python{script}{args}
您应该能够确定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,但除非您手动关闭连接,否则它将挂起。在你的终端中尝试
nohup sleep 1000&
查看为什么投反对票?我投了反对票,因为你的编辑毫无意义。在发回这里之前,你看了代码一眼吗?我明白了。是的,我忘记了第一个命令的更改。该死的复制粘贴。它还在抱怨找不到文件吗?是的。我在程序中使用了正确的命令,但我将旧命令粘贴到了这里。我登录到虚拟机,文件实际上就在那里
exec
是非阻塞的,所以我认为第二个命令(
cat
)可能是在实际创建文件之前执行的。我可以使用
睡眠
,但它似乎不是一种稳健的方法。
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
kill -9 `cat save_pid.txt`
rm save_pid.txt