Как я могу получить pids всех дочерних процессов, которые были запущены с ruby script?
Рубиновый список
Ответ 1
Вы можете получить текущий процесс с помощью
Process.pid
см. http://whynotwiki.com/Ruby_/_Process_management для более подробной информации.
Затем вы можете использовать конкретные команды для получения дочерних pids. В системах на основе unix это будет нечто вроде строк
# Creating 3 child processes.
IO.popen('uname')
IO.popen('uname')
IO.popen('uname')
# Grabbing the pid.
pid = Process.pid
# Get the child pids.
pipe = IO.popen("ps -ef | grep #{pid}")
child_pids = pipe.readlines.map do |line|
parts = line.split(/\s+/)
parts[2] if parts[3] == pid.to_s and parts[2] != pipe.pid.to_s
end.compact
# Show the child processes.
puts child_pids
Я признаю, что это, вероятно, не работает во всех Unix-системах, так как я полагаю, что вывод ps -ef
немного отличается от разных unix-аксессуаров.
Ответ 2
Process.fork отвечает PID дочернего порожденного. Просто отслеживайте их в массиве, когда вы создаете детей. См. http://ruby-doc.org/core/classes/Process.html#M003148.
Ответ 3
Можно также выполнить с помощью sys-proctable
gem:
require 'sys/proctable'
Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
Ответ 4
Это на самом деле довольно сложная и специфичная для платформы. Фактически не может находить все подпроцессы, если они намеренно пытаются скрыть.
Если вы хотите просто убить порожденные процессы, есть много вариантов. Для тестовой среды я выбрал два:
1. Инициировать процессы с помощью pgid => true
2. Вставьте переменную MY_CUSTOM_COOKIE=asjdkahf
, затем найдите procs с этим файлом cookie в среде и убейте его.
FYI с использованием ps
для поиска иерархии процессов очень ненадежный. Если один из процессов в цепочке выходит, то его подпроцессы получают родительский pid 1
(по крайней мере, по Linux). Так что это не стоит реализовывать.