2012-02-29 9 views
5

मैं अपनी तैनाती रणनीति के बारे में थोड़ा उलझन में हूं, जब मैं किस परिस्थितियों में तैनात करता हूं तो मैं reload यूनिकॉर्न को सिग्नल भेजना चाहता हूं? मेरे मामले में उदाहरण के लिए यह होगा की तरह:यूनिकॉर्न के लिए 'पुनरारंभ करें' के बजाय `रीलोड` का उपयोग करें?

bundle exec unicorn -c config/unicorn/production.rb -E production -D 

मैं सिर्फ क्यों सोच रहा हूँ:

sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid` 

मैं की तरह फिर से कि पीआईडी ​​की मौत हो गई, कुछ के माध्यम से तो गेंडा शुरू करने से मेरी क्षुधा की तैनाती कर रहा है मैं पुनः लोड का उपयोग करना चाहता हूँ? क्या मैं ऐसा करके अपनी तैनाती के लिए कोई प्रदर्शन प्राप्त कर सकता हूं?

उत्तर

14

जब आप यूनिकॉर्न को मारते हैं तो आप डाउनटाइम का कारण बनते हैं, जब तक यूनिकॉर्न बैक अप शुरू नहीं कर लेता है। जब आप यूएसआर 2 सिग्नल का उपयोग करते हैं, तो यूनिकॉर्न पहले नए श्रमिकों को शुरू करता है, फिर एक बार जब वे दौड़ रहे हैं, तो यह पुराने श्रमिकों को मार देता है। यह मूल रूप से यूनिकॉर्न को "बंद करने" की आवश्यकता को हटाने के बारे में है।

नोट, धारणा यह है कि पुराने यूनिकर्स की हत्या को संभालने के लिए आपके यूनिकॉर्न कॉन्फ़िगरेशन में before_fork हुक दस्तावेज है, एक ".oldbin" फ़ाइल मिलनी चाहिए, जिसमें पुरानी यूनिकॉर्न प्रक्रिया का पीआईडी ​​होना चाहिए :

before_fork do |server, worker| 
    # a .oldbin file exists if unicorn was gracefully restarted with a USR2 signal 
    # we should terminate the old process now that we're up and running 
    old_pid = "#{pids_dir}/unicorn.pid.oldbin" 
    if File.exists?(old_pid) 
    begin 
     Process.kill("QUIT", File.read(old_pid).to_i) 
    rescue Errno::ENOENT, Errno::ESRCH 
     # someone else did our job for us 
    end 
    end 
end 
संबंधित मुद्दे