2013-03-07 17 views
5

ARGV'u yöneten bir komisyon görevi gibi çalışmak için Thor'u kullanarak aşağıdaki bir komut dosyası var.Ruby'deki tüm süreçleri durdurmak için nasıl durdurulur?

#!/usr/bin/env ruby 
require "thor" 

class Run < Thor 

    desc "start", "start script" 
    def start 
     p1 = fork{ loop... } 
     p2 = fork{ loop... } 

     # 3 processes running 

     Process.detach(p1) 
     Process.waitpid(p1) 

    end 

    desc "stop", "stop script"  
    def stop 
    # kill all 3 pids 
    end 

end 

Run.start 

ruby script.rb start başladıktan sonra, iki alt prosesin (toplam üç) oluşturur. Sorum, ruby script.rb stop'u çalıştırdığımda tüm işlemleri nasıl öldüreceğimiz. Web'de, başlangıçta, pid üst sürecini bir dosyada saklamalıyım ve durduğunda, okurum ve öldürüyorum. Sorun şu ki, ebeveynleri öldürmek çocukları öldürmez. Böylece üç belgeyi de dosyaya kaydedip birer birer öldürürüm.

Kendime bunun doğru yolunun ne olduğunu ve start içindeki işlemlerle çalışma şeklimin doğru olup olmadığını soruyorum.

+2

öyle senin durumda, daemonized hizmetlerin oldukça yaygın bir uygulama gibi görünüyor Dosya sistemindeki tüm PID'leri depolamak gibi bir anlam ifade ederse, doğru süreçleri öldürmenin en doğru yolu budur. –

+0

Cevabınız için teşekkürler! – Luccas

+0

Olası bir alternatif, nesne kendiliğinden düzgün bir şekilde temizlenecek olan GC'leri aldığında bir sonlandırıcı eklemek olabilir. http://stackoverflow.com/questions/5956067/ruby-destructors Ayrıca süreçleri yönetmek için Daemons gem kullanabilirsiniz. http://daemons.rubyforge.org/ –

cevap

0

Eğer ebeveyn pid biliyorsanız bulmak ve bunun gibi tüm çocukları öldürebilir: Dosya sistemi üzerinde PID saklanması

# Find child pids, works on Linux/OSX 
def child_pids(pid) 
    pipe = IO.popen("ps -ef | grep #{pid}") 
    pipe.readlines.map do |line| 
    parts = line.strip.split(/\s+/) 
    parts[1].to_i if parts[2] == pid.to_s and parts[1] != pipe.pid.to_s 
    end.compact 
end 

# kill -9 every child 
child_pids(parent_pid).each { |pid| Process.kill('TERM', pid) } 
İlgili konular