Я запускаю удаленный скрипт 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
exec
не блокирует, поэтому я подумал, что вторая команда (cat
), вероятно, выполняется до фактического создания файла. Я мог бы использоватьsleep
, но это не кажется надежным подходом. - person Rojj   schedule 28.06.2017