список рубинов - PullRequest
       24

список рубинов

10 голосов
/ 18 декабря 2009

Как я могу получить pids всех дочерних процессов, которые были запущены из сценария ruby?

Ответы [ 4 ]

12 голосов
/ 19 декабря 2009

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

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.lstrip.split(/\s+/)
  parts[1] if parts[2] == pid.to_s and parts[1] != pipe.pid.to_s
end.compact

# Show the child processes.
puts child_pids

Проверено на osx + ubuntu.

Я признаю, что это, вероятно, не работает на всех системах Unix, так как я считаю, что вывод ps -ef незначительно различается для разных версий Unix.

6 голосов
/ 19 декабря 2009

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

2 голосов
/ 12 апреля 2013

Можно также сделать, используя sys-proctable gem:

require 'sys/proctable'

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
1 голос
/ 15 апреля 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...