2009-12-18 3 views

ответ

12

Вы можете получить текущий процесс:

Process.pid 

см http://whynotwiki.com/Ruby_/_Process_management для получения более подробной информации.

Затем вы можете использовать конкретные команды для получения дочерних сообщений. В системах на базе 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 немного меняется на разном Юниксе.

+1

'Process.pid' возвращает pid текущего процесса, а не родительский процесс. Чтобы получить родительский процесс pid, выполните 'Process.ppid'. – henrikhodne

+0

Просто ошибка в комментариях, в которых нам нужен текущий процесс, так как это будет родителем дочерних процессов. – Jamie

+5

Всего несколько центов: «ps o pid = --ppid # {pid}» может быть более удобным, чем «ps -ef | grep # {pid}», и вам не придется отфильтровывать ненужные строки и поля в этом случае , – timurb

6

Process.fork отвечает с PID дочернего порожденного. Просто отслеживайте их в массиве, когда вы создаете детей. См. http://ruby-doc.org/core/classes/Process.html#M003148.

+0

Это был бы хороший вариант, но в моем случае у меня есть метод, дающий блок и единственный способ отслеживать все вызовы fork, system, spawn, backtrick и другие, чтобы связать эти методы с помощью счетчика pid, но я надеялся что есть более простой способ получить дочерние элементы – tig

2

Может быть также сделано с помощью sys-proctable перл:

require 'sys/proctable' 

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ } 
0

Это на самом деле тихий сложен и зависит от платформы. Вы на самом деле не можете найти все подпроцессы, если они намеренно пытаются скрыть.

Если вы хотите просто убить порожденные процессы, есть много вариантов. Для тестового каркаса я выбрал два: 1. Процессы икры с pgid => true 2. Вставьте переменную MY_CUSTOM_COOKIE=asjdkahf, затем найдите procs с этим файлом cookie в среде и убейте его.

FYI с использованием ps для определения иерархии процессов очень ненадежен. Если один из процессов в цепочке выходит, то его подпроцессы получают родительский pid из 1 (по крайней мере, по Linux). Так что это не стоит реализовывать.

Смежные вопросы