Рубиновый список

Как я могу получить 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-аксессуаров.

Ответ 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). Так что это не стоит реализовывать.