2011-04-26 18 views
7

मैं एक रूबी डिमन बनाना चाहता हूं जो एक हत्या कमांड के साथ शानदार ढंग से बंद हो जाएगा। मैं एक सिग्नल जाल जोड़ना चाहता हूं जो #code that could take some time to run बंद होने से पहले समाप्त हो जाएगा। कैसे जोड़ा होता है कि कुछ इस तरह हैं:स्वच्छ शट डाउन के साथ रूबी डिमन

pid = fork do 
    pid_file = "/tmp/pids/daemon6.pid" 
    File.open(pid, 'w'){ |f| f.write(Process.pid) } 
    loop do 
     begin 
     #code that could take some time to run 
     rescue Exception => e 
     Notifier.deliver_daemon_rescued_notification(e) 
     end 
     sleep(10) 
    end 
end 
Process.detach pid 

इसके अलावा, यह बेहतर होगा एक अलग लिपि में है कि, एक अलग मार स्क्रिप्ट की तरह है करने के लिए की बजाय डेमॉन कोड के हिस्से के रूप में यह हो रही है? कुछ monit या God की तरह इसे रोकने के लिए कॉल करेंगे?

मैं किसी भी सुझाव की सराहना करता हूं।

उत्तर

7

आप Interrupt, इस तरह पकड़ कर सकते हैं:

pid = fork do 
    begin 
    loop do 
     # do your thing 
     sleep(10) 
    end 
    rescue Interrupt => e 
    # clean up 
    end 
end 
Process.detach(pid) 

आप Signal.trap('INT') { ... } साथ भी ऐसा ही कर सकते हैं, लेकिन sleep के साथ शामिल मुझे लगता है कि यह एक अपवाद को पकड़ने के लिए आसान है।

अद्यतन: इस कर का एक और अधिक परंपरागत तरीके से है, और यह सुनिश्चित करें कि पाश हमेशा एक पूरा जाने खत्म होने से पहले ही बंद हो जाता है बनाता है:

pid = fork do 
    stop = false 
    Signal.trap('INT') { stop = true } 
    until stop 
    # do your thing 
    sleep(10) 
    end 
end 

नकारात्मक पक्ष यह है कि यह हमेशा sleep करना होगा , इसलिए जब तक आप इसे मारने के बाद प्रक्रिया बंद हो जाती है तब तक लगभग हमेशा देरी होगी। आप संभवतः विस्फोटों में सोकर, या वेरिएंट के संयोजन (Interrupt को sleep या कुछ के आसपास) से बचाकर प्राप्त कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद, समस्या यह है कि इंटरप्ट को पकड़ने से मुख्य लूप खत्म नहीं हो जाएगा। मैं क्या करना चाहता हूं कि बाधा पकड़ने के लिए, लूप खत्म होने दें और फिर प्रक्रिया को साफ करें और मार दें। – fflyer05

+0

मैंने अपने उत्तर को ऐसा करने के किसी अन्य तरीके से अपडेट किया है जो अधिक सुंदरता से बाहर निकलता है (लेकिन इसके बजाय 'नींद' में समस्याएं हैं)। – Theo

+0

वह अच्छी तरह से करेगा। धन्यवाद! अगर लूप तक नींद की कॉल ली गई तो क्या होगा? मैंने सोचा था कि रूबी की नींद पहले ही विस्फोटों में थी ताकि आईएनटी सिग्नल इसे नींद से बाहर निकाल दे। वैसे भी, अतिरिक्त नींद एक छोटी सी समस्या है तो लूप के बीच में एक प्रक्रिया को रोक दिया जाता है। – fflyer05

संबंधित मुद्दे