Ruby Net/SSH exec – получить pid удаленного процесса

Я запускаю удаленный скрипт nohup с Ruby Net/SSH.

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 удаленного скрипта, чтобы я мог убить его, если это необходимо?

EDIT 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

person Rojj    schedule 28.06.2017    source источник
comment
Почему отрицательный голос?   -  person Rojj    schedule 28.06.2017
comment
Я проголосовал против, потому что ваше редактирование не имеет смысла. Вы смотрели хотя бы секунду на код, прежде чем опубликовать его здесь?   -  person hek2mgl    schedule 28.06.2017
comment
Понимаю. Да, я забыл изменить первую команду. Проклятый копипаст.   -  person Rojj    schedule 28.06.2017
comment
Он все еще жалуется, что файл не может быть найден?   -  person hek2mgl    schedule 28.06.2017
comment
да. Я использовал правильную команду в своей программе, но вставил сюда старую. Я вошел в виртуальную машину, и файл действительно там. exec не блокирует, поэтому я подумал, что вторая команда (cat), вероятно, выполняется до фактического создания файла. Я мог бы использовать sleep, но это не кажется надежным подходом.   -  person Rojj    schedule 28.06.2017


Ответы (1)


Вы должны быть в состоянии определить 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
person Vamsi Krishna    schedule 28.06.2017
comment
Хорошо, теперь он даст вам pid, но он будет зависать, если вы не закроете соединение вручную. Попробуйте nohup sleep 1000 & в своем терминале, чтобы увидеть - person hek2mgl; 28.06.2017