2009-12-18 12 views

Respuesta

12

, 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.

+1

'Process.pid' devuelve el pid del proceso actual, no el proceso principal. Para obtener el proceso padre pid, haga 'Process.ppid'. – henrikhodne

+0

Solo un error en los comentarios necesitamos el proceso actual, ya que este será el padre de los procesos hijos. – Jamie

+5

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

6

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.

+0

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

2

también se pueden hacer usando sys-proctable joya:

require 'sys/proctable' 

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

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.