¿Cómo puedo obtener pids de todos los procesos secundarios que se iniciaron desde el script de ruby?ruby list pids infantiles
Respuesta
, usted puede obtener el proceso actual con:
Process.pid
ver http://whynotwiki.com/Ruby_/_Process_management para más detalles.
Posteriormente, se podría utilizar comandos específicos que operan para conseguir los PIDs niño. En sistemas basados en UNIX esto sería algo en la línea de
# 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
que admitir que esto probablemente no funciona en todos los sistemas UNIX como creo que la salida de ps -ef
varía ligeramente entre las distintas versiones de Unix.
Process.fork responde con el PID del secundarias generadas. Solo haga un seguimiento de ellos en una matriz mientras engendra hijos. Ver http://ruby-doc.org/core/classes/Process.html#M003148.
que sería una buena variante, pero en mi caso tengo un método que arroje un bloque y la única manera de realizar un seguimiento de todas las llamadas al tenedor, sistema, freza, backtrick y otros, a la cadena de esos métodos a través de contador pid, pero yo esperaba que hay una manera más fácil de obtener pids de niños – tig
también se pueden hacer usando sys-proctable
joya:
require 'sys/proctable'
Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ }
Esto es realmente tranquila complicado y es específica de la plataforma. De hecho, no puede encontrar todos los subprocesos si deliberadamente intentan esconderse.
Si quieres matar simplemente procesos generados hay muchas opciones. Para un marco de pruebas he elegido dos: 1. procesos de regeneración con pgid => true
2. Insertar variable MY_CUSTOM_COOKIE=asjdkahf
, y luego encontrar procsos con esa cookie en el medio ambiente y acabar con él.
FYI usando ps
para averiguar jerarquía de procesos es muy poco fiable. Si un proceso en la cadena sale, entonces sus subprocesos obtienen un pid padre de 1
(al menos en Linux). Entonces no vale la pena implementarlo.
- 1. Seguir pids across machines (ssh)
- 2. Htop que muestra múltiples procesos java con diferentes pids
- 3. List.empty vs. List() vs. new List()
- 4. Polimorfismo: ¿Por qué usar "List list = new ArrayList" en lugar de "ArrayList list = new ArrayList"?
- 5. ¿Cuál es la diferencia entre list [-1:] [0] y list [len (list) -1]?
- 6. ¿Cuál es la diferencia entre list y list [:] en python?
- 7. Elementos que se pueden hacer clic o widgets infantiles dentro del delegado pintado a mano
- 8. Boost Intrusive List hook
- 9. .NET Casting Generic List
- 10. Android Endless List
- 11. coldfusion distinct list
- 12. Scala Annotation List?
- 13. Mathematica Dynamic List Manipulation
- 14. Flatten List en LINQ
- 15. MigraDoc Bullet List (agujeros)
- 16. iphone bullet list
- 17. usando android animation-list
- 18. Android Swipe on List
- 19. Spring autowire a list
- 20. java: list thread locals?
- 21. Extendiendo std :: list
- 22. list monad transformer
- 23. List Intersect return null
- 24. List Iterator Remove()
- 25. boost :: python :: list length
- 26. java.util.Iterator a Scala list?
- 27. C++ list/vector help
- 28. Python list issue
- 29. cakephp find list
- 30. comando Cmake list-get
'Process.pid' devuelve el pid del proceso actual, no el proceso principal. Para obtener el proceso padre pid, haga 'Process.ppid'. – henrikhodne
Solo un error en los comentarios necesitamos el proceso actual, ya que este será el padre de los procesos hijos. – Jamie
Solo unos pocos centavos: "ps o pid = --ppid # {pid}" podría ser más útil que "ps -ef | grep # {pid}" y no tendrá que filtrar las líneas y campos innecesarios en este caso . – timurb