Как я могу получить pids всех дочерних процессов, которые были запущены из ruby-скрипта?ruby list child pids
ответ
Вы можете получить текущий процесс:
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
немного меняется на разном Юниксе.
Process.fork отвечает с PID дочернего порожденного. Просто отслеживайте их в массиве, когда вы создаете детей. См. http://ruby-doc.org/core/classes/Process.html#M003148.
Это был бы хороший вариант, но в моем случае у меня есть метод, дающий блок и единственный способ отслеживать все вызовы fork, system, spawn, backtrick и другие, чтобы связать эти методы с помощью счетчика pid, но я надеялся что есть более простой способ получить дочерние элементы – tig
Может быть также сделано с помощью sys-proctable
перл:
require 'sys/proctable'
Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
Это на самом деле тихий сложен и зависит от платформы. Вы на самом деле не можете найти все подпроцессы, если они намеренно пытаются скрыть.
Если вы хотите просто убить порожденные процессы, есть много вариантов. Для тестового каркаса я выбрал два: 1. Процессы икры с pgid => true
2. Вставьте переменную MY_CUSTOM_COOKIE=asjdkahf
, затем найдите procs с этим файлом cookie в среде и убейте его.
FYI с использованием ps
для определения иерархии процессов очень ненадежен. Если один из процессов в цепочке выходит, то его подпроцессы получают родительский pid из 1
(по крайней мере, по Linux). Так что это не стоит реализовывать.
- 1. Anorm Populate Child List
- 2. JQuery Filter list by child
- 3. custom Expendable List view child
- 4. Переместить рельсы /tmp/pids/server.pid файл в систему/tmp/pids/
- 5. Oracle APEX Navigation List Child Objects
- 6. Wordpress List Child Pages, как категория
- 7. Как передать значение объекту child/list?
- 8. Ruby call child method only
- 9. Ruby: reverse, mutating list
- 10. Как перечислить все фоновые pids в bash
- 11. perl pgrep возвращает несколько pids
- 12. Ruby: List DateTime Format Options
- 13. Ruby Singly Linked List Implementation
- 14. Ruby sort array by child collection
- 15. Ruby, Retrieve Child Object By Key
- 16. android expandable list view get group from child
- 17. jquery first-child on fadeIn fadeOut list не работает
- 18. Процессы убийства в Erlang по PIDs
- 19. Переходные процессы gen_server и обновления pids
- 20. OSX убивать процессы по порту, кроме PIDs
- 21. Bash - получение PIDs братьев и сестер
- 22. bash скрипт для сбора pids в массиве
- 23. Linux C процессы PIDS глобальной видимости
- 24. Ruby версия не в Ruby-build list для rbenv
- 25. Реализация включает? для сборки Ruby Grocery List
- 26. Python - List List List List
- 27. jQuery first-child nth-child
- 28. Ruby on Rails упорядочивает родительскую модель по атрибуту child
- 29. Значение проверки родителя в модели Child, Ruby on Rails
- 30. Использование селектора child css в элементе ruby selenium-webdriver find_elements
'Process.pid' возвращает pid текущего процесса, а не родительский процесс. Чтобы получить родительский процесс pid, выполните 'Process.ppid'. – henrikhodne
Просто ошибка в комментариях, в которых нам нужен текущий процесс, так как это будет родителем дочерних процессов. – Jamie
Всего несколько центов: «ps o pid = --ppid # {pid}» может быть более удобным, чем «ps -ef | grep # {pid}», и вам не придется отфильтровывать ненужные строки и поля в этом случае , – timurb