2009-07-10 11 views
19

के साथ पृष्ठभूमि कार्यों को शुरू करना मेरे रूबीऑनरल-ऐप के लिए मुझे कैपिस्ट्रानो परिनियोजन के अंत में पृष्ठभूमि की नौकरी शुरू करनी है। इस के लिए, मैं deploy.rb में निम्नलिखित की कोशिश की:कैपिस्ट्रानो

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true 

कभी कभी यह काम करता है, लेकिन समय यह प्रक्रिया शुरू नहीं करता है के सबसे (= ps -aux में सूचीबद्ध नहीं)। और कोई त्रुटि संदेश नहीं हैं। और घर निर्देशिका में नहीं, और रेल ऐप निर्देशिका में नहीं, no noupup.out नहीं है।

मैंने नूप के बजाय शेड्यूलर.आरबी में जाल ('SIGHUP', 'IGNORE') का उपयोग करने की कोशिश की, लेकिन नतीजा वही है।

इसे काम करने का एकमात्र तरीका ": pty => true" को हटा रहा है और "टोपी तैनाती" के अंत में मैन्युअल Ctrl-C करें। लेकिन मुझे यह पसंद नहीं है ...

क्या इस शेड्यूलर को शुरू करने की कोई अन्य संभावना है। स्टार्ट? या कुछ और त्रुटि संदेश प्राप्त करने के लिए?

मैं रेल 2.3.2, Capistrano 2.5.8 का उपयोग कर रहा हूँ, सर्वर पर Ubuntu Hardy

+0

कोई संकेत? अभी भी पृष्ठभूमि नौकरी को पुनरारंभ करने के साथ लड़ रहे हैं ... –

उत्तर

1

आप अपने समयबद्धक काम पृष्ठभूमि में लगातार चलाने के लिए और पुन: प्रारंभ करने के लिए जब आप Capistrano चलाने करना चाहते हैं?

यदि हां, तो उस के लिए मैं RUNIT http://smarden.sunsite.dk/runit/ और DelayedJob का उपयोग http://github.com/Shopify/delayed_job/tree/master

  1. init
  2. की जगह नहीं के मोड में RUNIT स्थापित अपनी पृष्ठभूमि काम एक RUNIT सेवा के रूप में है और इसके लिए लॉग मॉनिटर जोड़ने रनिट से।
  3. कैपिस्ट्रानो कॉल sudo sv को नौकरी मारने और नौकरी को पुनरारंभ करने के लिए job_name मार डालो।

मेरा पिछला नौकरी रेल प्लगइन DelayedJob का एक उदाहरण है जो पृष्ठभूमि रेल कार्यों को संभालता है। मैं इसे प्रत्येक Capistrano तैनाती के साथ मार डालता हूं ताकि यह अद्यतन कोड बेस के साथ पुनरारंभ होगा।

यह बहुत विश्वसनीय साबित हुआ है।

HTH,

लैरी

+0

हां, शेड्यूलर पृष्ठभूमि में लगातार चलना चाहिए और प्रत्येक तैनाती पर पुनरारंभ करना चाहिए। मैं शेड्यूलर में DelayedJob का उपयोग कर - और कुछ खुद की चीजें। क्योंकि स्क्रिप्ट/धावक के माध्यम से शुरू करना कभी-कभी कैपिस्ट्रानो के साथ काम करता है (और हमेशा अगर मैं इसे एसएसएच सत्र के माध्यम से मैन्युअल रूप से शुरू करता हूं) मुझे लगता है कि कैपिस्ट्रानो के साथ केवल एक छोटी सी समस्या है - और इसलिए मैं दौड़ने के लिए कदम नहीं बनाना चाहता, अगर इसकी ज़रूरत नहीं है ... लेकिन एवर के लिए बहुत बहुत धन्यवाद, लैरी! –

+0

रीबूट पर ऑटो-रीस्टार्ट के बारे में क्या? यह कुछ और है जो रनिट का ख्याल रखता है। - प्लस फिर से शुरू होता है अगर यह कभी मर जाता है। सादर। –

+0

@ जॉर्ज: यदि आपको लैरी का जवाब पसंद है, तो कृपया –

14
साथ

: Pty => true, उपयोगकर्ता खोल शुरू हुआ लिपियों (जैसे bashrc, आदि) (आमतौर पर) लोड नहीं होतीं। निर्भर पर्यावरण चर की कमी के कारण लॉन्च होने के बाद मेरा रूबी कार्यक्रम ठीक से बाहर निकला।

बिना: pty => सत्य, जैसा कि आपने प्रश्न में वर्णित किया है, capistrano बाहर निकलने की प्रक्रिया के लिए प्रतीक्षा कर रहा है। इसे तुरंत वापस करने के लिए आपको दोनों stdout और stderr को पुनर्निर्देशित करने की आवश्यकता होगी।

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good. 

यदि आपका पृष्ठभूमि कार्य अभी भी नहीं चलता है। एक लॉग फ़ाइल में stdout और stderr को पुनर्निर्देशित करने का प्रयास करें ताकि आप आउटपुट की जांच कर सकें।

+1

मैं पूरे दिन एक ही समस्या के साथ संघर्ष कर रहा था। जैसा कि सुझाव दिया गया है, आउटपुट को पुनर्निर्देशित करने से समस्या हल हो गई है। – randomuser

1

यदि इस कार्य शेड्यूलर में एक-डी स्विच है तो यह काम करेगा। उदाहरण के लिए यात्री स्टैंडअलोन में एक राक्षसी प्रक्रिया के रूप में इसे शुरू करने के लिए एक विकल्प है।

namespace :passenger_standalone do 
    task :start do 
    run "cd #{current_path} && passenger start -e #{rails_env} -d" 
    end 
    task :stop do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop" 
    end 
    task :restart do 
    stop 
    start 
    end 
end 
6

मैं अपना समाधान साझा करना चाहता हूं जो एकाधिक आदेशों को निष्पादित करते समय भी काम करता है। मैंने "नींद एन" हैक सहित ऑनलाइन कई अन्य प्रकारों को आजमाया।

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true) 

यह एक dup प्रतिक्रिया launching background process in capistrano task है, लेकिन यकीन है कि दूसरों को बनाना चाहते हैं और अपने आप को इस समाधान के लिए गूगल कर सकते हैं।

+0

इससे मेरी मदद मिली। धन्यवाद। –