2011-11-21 9 views
7

Actualmente estoy haciendo esto en un símbolo del sistemaprocesos y subprocesos de muertes en Ruby en Windows

require 'win32/process' 
p = Process.spawn("C:/ruby193/bin/bundle exec rails s") 
puts p 
Process.waitpid(p) 

y luego en otro

require 'win32/process' 
Process.kill(1,<p>) 

El problema es que el proceso que desovan (el servidor Rails en este caso) genera una cadena de subprocesos. El comando kill no los mata, solo los deja huérfanos sin padre.

¿Alguna idea de cómo puedo matar a todo el proceso generado y todos sus hijos?

Respuesta

4

finalmente he resuelto esto de la siguiente manera

En primer lugar he instalado la gema sys-proctable

gem install 'sys-proctable' 

utiliza entonces el Iniciado código para spawn el proceso, y la siguiente para matarlo (error manipulaciones omite por razones de brevedad)

require 'win32/process' 
require 'sys/proctable' 
include Win32 
include Sys 

    to_kill = .. // PID of spawned process 
    ProcTable.ps do |proc| 
    to_kill << proc.pid if to_kill.include?(proc.ppid) 
    end 

    Process.kill(9, *to_kill) 
    to_kill.each do |pid| 
    Process.waitpid(pid) rescue nil 
    end 

podría cambiar el kill 9 de algo un poco menos ofensivo por supuesto, pero esta es la esencia de la solución.

+0

Me pregunto si el ciclo para obtener procs es confiable. En Linux, los procesos pueden estar fuera de servicio, por lo que se necesitarán algunas iteraciones para captar todos. – akostadinov

-2

Solución de guion único sin gemas. Ejecute la secuencia de comandos, CTRL-C para detener todo:

processes = [] 
processes << Process.spawn("<your process>") 

loop do 
    trap("INT") do 
    processes.each do |p| 
     Process.kill("KILL", p) rescue nil 
     Process.wait(p) rescue nil 
    end 
    exit 0 
    end 
    sleep(1) 
end 
+0

No veo cómo funcionaría esto. 'spawn' devuelve un solo pid (no todos los pids secundarios). El hecho de que hayas agregado ese pid a una matriz y haya bucleado es superfluo. – AlexChaffee

Cuestiones relacionadas