2012-03-07 16 views
9

शायद आप इस देखा है ...हेरोकू के सिग्नल को समझने के लिए मैं यूनिकॉर्न कैसे कह सकता हूं?

 
2012-03-07T15:36:25+00:00 heroku[web.1]: Stopping process with SIGTERM 
2012-03-07T15:36:36+00:00 heroku[web.1]: Stopping process with SIGKILL 
2012-03-07T15:36:36+00:00 heroku[web.1]: Error R12 (Exit timeout) -> Process failed to exit within 10 seconds of SIGTERM 
2012-03-07T15:36:38+00:00 heroku[web.1]: Process exited with status 137 

यह एक अच्छी तरह से ज्ञात समस्या है जब heroku पर unicorn चल रहा है ...

कर सकते हैं मैं heroku को SIGQUIT भेजने के लिए कहता हूं? या क्या मैं SIGTERM को शट डाउन के रूप में इलाज करने के लिए यूनिकॉर्न बता सकता हूं?

+0

मैं जानता हूँ कि didin't मैं एक परियोजना के लिए गेंडा विचार कर रहा था, लेकिन यह मुझे बनाता है। पुनर्विचार करना। यहां सिग्नल हैं जो पतले उपयोग करते हैं: https://github.com/macournoyer/thin/blob/master/lib/thin/server.rb#L211 दोनों मामलों में, QUIT एक सुंदर शट डाउन सिग्नल करता है, लेकिन आईएनटी और टीईआरएम बदल जाते हैं। –

+1

बीटीडब्ल्यू, यहां एक और कारक है - Heroku Procfile में परिभाषित प्रक्रिया में टीईआरएम भेज देगा, लेकिन फिर यह प्रक्रिया सिग्नल को सौंपने के लिए ज़िम्मेदार है क्योंकि यह फिट दिखाई देती है। तो यदि आप अपने सर्वर को बंडल निष्पादन के पीछे चला रहे हैं, भले ही उसकाोकू सही सिग्नल भेज रहा हो, तो आप उपर्युक्त व्यवहार देखेंगे क्योंकि वेबसर्वर को संकेत नहीं मिलता है। मैंने इसके बारे में समर्थन करने के लिए बात की है और वे समाधान के साथ आ रहे हैं। –

+2

मुझे आज यह पता चला है, मैंने अभी तक इसका पता नहीं लगाया है: https://github.com/ddollar/foreman/wiki/Custom-Signals –

उत्तर

6

यह एक हैक है, लेकिन मैंने सफलतापूर्वक एक यूनिकॉर्न कॉन्फ़िगरेशन फ़ाइल बनाई है जो TERM सिग्नल को जालती है, जो यूनिकॉर्न को प्राप्त करने से रोकती है और इसे तुरंत बंद कर देती है। मेरा सिग्नल हैंडलर QUIT भेजता है जो यूनिकॉर्न सुंदर शटडाउन को ट्रिगर करने के लिए स्वयं को सिग्नल करता है।

रूबी 1.9.2, यूनिकॉर्न 4.0.1 और 4.2.1, मैक ओएस एक्स के साथ परीक्षण किया गया

listen 9292 
worker_processes 1 

# This is a hack. The code is run with 'before_fork' so it runs 
# *after* Unicorn installs its own TERM signal handler (which makes 
# this highly dependent on the Unicorn implementation details). 
# 
# We install our own signal handler for TERM and simply re-send a QUIT 
# signal to our self. 
before_fork do |_server, _worker| 
    Signal.trap 'TERM' do 
    puts 'intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 
end 

एक चिंता यह है कि (मेरा मानना ​​है कि) है इस संकेत हैंडलर कार्यकर्ता प्रक्रियाओं द्वारा विरासत में मिली है। लेकिन, कार्यकर्ता प्रक्रिया अपना TERM हैंडलर स्थापित करती है, जिसे इसे ओवरराइट करना चाहिए, इसलिए मुझे किसी भी मुद्दे की उम्मीद नहीं होगी। (Unicorn::HttpServer#init_worker_process @ lib/unicorn/http_server.rb:551 देखें

संपादित करें:।। एक और अधिक विस्तार, इस ब्लॉक को स्थापित करता है कि संकेत हैंडलर क्योंकि before_fork (वर्कर प्रोसेस प्रति एक बार चलेंगे), लेकिन यह केवल निरर्थक और को प्रभावित नहीं करेगा कुछ भी

+2

यह स्वीकार्य उत्तर है क्योंकि पैट्रिक इसके साथ आया था बी 4 heroku किया ... लेकिन नवीनतम आधिकारिक उत्तर के लिए क्ले का जवाब देखें –

9

Heroku अब प्रदान करता है यह यहाँ के लिए निर्देश: https://blog.heroku.com/archives/2013/2/27/unicorn_rails

उनके द्वारा सुझाए गए unicorn.rb फ़ाइल है:

# config/unicorn.rb 
worker_processes 3 
timeout 30 
preload_app true 

before_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

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

  • कोई संबंधित समस्या नहीं^_^