2011-11-21 6 views
7

Actuellement, je suis en train de faire en une seule commande rapideTuer le processus et sous-processus dans Ruby sous Windows

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

puis dans un autre

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

Le problème est que le processus que je Spawn (le serveur Rails dans ce cas) génère une chaîne de sous-processus. La commande kill ne les tue pas, elle les laisse orphelins sans aucun parent.

Des idées comment puis-je tuer l'ensemble du processus engendré et tous ses enfants?

Répondre

4

J'ai finalement résolu ce de la manière suivante

D'abord, j'installé le sys-proctable joyau

gem install 'sys-proctable' 

ont ensuite utilisé le posté à l'origine du code pour spawn le processus, et ce qui suit pour le tuer (erreur manutention omis par souci de concision)

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 

Vous pouvez changer le kill 9 à quelque chose d'un peu moins offensive bien sûr, mais c'est l'essentiel de la solution.

+0

Je me demande si la boucle pour obtenir procs est fiable. Sur Linux, les processus peuvent être en panne, donc quelques itérations peuvent être nécessaires pour tout attraper. – akostadinov

-2

Solution à un script sans gemmes. Exécutez le script, CTRL-C pour tout arrêter:

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

Je ne vois pas comment cela pourrait fonctionner. 'spawn' renvoie un seul pid (pas tous les enfants pids). Le fait que vous ayez ajouté ce pid à un tableau et que vous ayez fait une boucle est superflu. – AlexChaffee