2011-11-21 7 views
7

Attualmente sto facendo questo in un prompt dei comandiprocesso di uccidere e sotto-processi in Ruby on di Windows

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

e poi in un altro

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

Il problema è che il processo di I Spawn (il server Rails in questo caso) genera una catena di sottoprocessi. Il comando kill non li uccide, li lascia orfani senza genitore.

Qualche idea come posso uccidere l'intero processo generato e tutti i suoi figli?

risposta

4

alla fine ho risolto questo nel modo seguente

Per prima cosa ho installato la gemma sys-proctable

gem install 'sys-proctable' 

poi utilizzato il Messaggio inserito codice per spawn il processo, e il seguente di ucciderlo (errore manipolazione omesse per brevità)

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 

Si potrebbe cambiare il kill 9 a qualcosa di un po 'meno offensivo ovviamente, ma questo è l'essenza della soluzione.

+0

Mi chiedo se il ciclo per ottenere proc è affidabile. Sui processi linux potrebbe essere fuori servizio, quindi potrebbero essere necessarie alcune iterazioni per catturare tutto. – akostadinov

-2

Soluzione con un solo script senza gemme. Esegui lo script, CTRL-C per interrompere tutto:

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

Non vedo come funzionerebbe. 'spawn' restituisce un singolo pid (non tutti i pid child). Il fatto che tu abbia aggiunto il pid a un array e il loop sia superfluo. – AlexChaffee

Problemi correlati