2012-08-23 8 views
29

मैं एक कार्यकर्ता के कई उदाहरण इस जवाब में वर्णित के रूप में चल रहा हूँ: Starting multiple upstart instances automaticallyपुन: आरंभ करना कल का नवाब उदाहरण प्रक्रियाओं

प्रश्न: मैं एक बार में सभी उदाहरणों को पुनः आरंभ कर सकते हैं?

मेरी कार्यकर्ताओं शुरू करने के लिए मैं कर सकते हैं:

initctl स्थिति कार्यकर्ता एन = 1 कार्यकर्ता:

मेरी कार्यकर्ता

कौन सा फिर मुझे करने की अनुमति देता शुरू initctl (1) शुरू/चलाना, प्रक्रिया 551

initctl स्थिति कार्यकर्ता एन = 2 कार्यकर्ता (2) प्रारंभ/चल रहा है, प्रक्रिया 552

वहाँ इस तरह कुछ करने के लिए एक रास्ता है:

मेरी कार्यकर्ता initctl पुनः आरंभ

मैं बिना सभी उदाहरणों को पुनः आरंभ करने में सक्षम होना चाहते हैं यह जानने के लिए कि कितने दौड़ रहे हैं।

stop on shutdown 

करने के लिए::

यहाँ

stop on shutdown 

chdir /path/to/current 

respawn 

instance $N 

script 
    exec su -c "/home/worker/.rvm/bin/rvm-shell -c 'bundle exec rake work 2>&1 >> /var/log/worker-$N.log'" worker 
end script 

उत्तर

35

worker.conf में आप सिर्फ इस लाइन को बदलने की जरूरत मेरी मेरी-workers.conf

start on stopped cloud-init 
stop on shutdown 

env NUM_WORKERS=4 

script 
    for i in `seq 1 $NUM_WORKERS` 
    do 
     start worker N=$i 
    done 
end script 

और worker.conf है

stop on stopping my-workers 

और बदल my-workers.confscript के बजाय pre-start उपयोग करने के लिए:

pre-start script 
    for i in `seq 1 $NUM_WORKERS` 
    do 
    start worker N=$i 
    done 
end script 

अब my-workers राज्य रखेंगे: के बाद से काम pre-start में होता है, my-workers मुख्य प्रक्रिया मौजूद नहीं होगा और इसलिए बाहर निकलने नहीं होगा। stop on stopping my-workers जब भी my-workers बंद हो जाता है तो श्रमिकों को रोकने का कारण बनता है। फिर निश्चित रूप से जब यह फिर से शुरू होता है तो यह फिर से श्रमिकों को शुरू करेगा।

(FYI, stop on shutdown कुछ भी नहीं करता है, क्योंकि shutdown एक सिस्टम ईवेंट नहीं है।सभी परिभाषित घटनाओं) के लिए तो आप भी stop on runlevel [06]

+4

मुझे कुछ समय लिया समझने के लिए तुम क्या मतलब है, लेकिन एक बार मुझे मिल गया ... * मन * – Evgeny

+0

@Evgeny यहाँ एक ही है, haha ​​उड़ा। अगर मुझे पसंद है, और शायद इव्गेनी, आपने बस यह समझने की कोशिश में 5 मिनट बिताए कि क्या हो रहा है: मूल रूप से मेरे-वर्कर्स.कॉफ कई अपस्टार्ट स्क्रिप्ट्स और एक्टिट्स को बढ़ाते हैं, लेकिन प्रत्येक वर्कर.कॉफ में अब मेरे श्रमिकों को रोकने पर रोक है ', इसलिए जब आप पहले से ही मेरी मजदूरों की प्रक्रिया को रोकने से रोकने का प्रयास करते हैं, तो मजदूर अभी भी इसे सुनेंगे और मर जाएंगे। तो मेरे मजदूरों को "पुनरारंभ करना", भले ही यह वास्तव में पहले नहीं चल रहा था, फिर भी श्रमिकों (रोक) को मारने और प्री-स्टार्ट स्क्रिप्ट (शुरूआत) को फिर से चलाने का प्रभाव फिर से चल रहा है। – Mahn

+1

यह काम करता है लेकिन यह काफी हैकिश है। वास्तव में सेवा 'मेरे मजदूरों की शुरूआत' लटकाएगी। उपस्टार्ट दस्तावेज़ों में कहा गया है कि 'सभी नौकरी फ़ाइलों में या तो एक निष्पादन या स्क्रिप्ट stanza होना चाहिए।' 'प्री-स्टार्ट स्क्रिप्ट और पोस्ट-स्टॉप स्क्रिप्ट - इन प्रक्रियाओं को शुरू करने की उम्मीद नहीं है, वास्तव में, वे नहीं कर सकते हैं।' शायद श्रमिकों को रोकने या पुनरारंभ करने के लिए एक और नौकरी बनाने के लिए बेहतर है। –

7

करने के लिए अपने कार्यकर्ताओं बदलना चाहिए man upstart-events मैं ऊपर से एक उदाहरण के साथ यह कोशिश की और SpamapS का जवाब, मैं प्राप्त किया:

init: my-workers pre-start process (22955) terminated with status 127 

/var/log/upstart/my-workers.log में मैं समस्या दिखाई दी:

/proc/self/fd/9: 6: /proc/self/fd/9: end: not found 

के लिए लूप my-workers.conf में गलत वाक्य रचना लग रहा था end। मैं

script 
    for i in `seq 1 $NUM_WORKERS` 
    do 
    start worker N=$i 
    done 
end script 

साथ

script 
    for i in `seq 1 $NUM_WORKERS` 
    do 
     start worker N=$i 
    done 
    end 
end script 

प्रतिस्थापित और यह काम किया!

stop on shutdown or workers-stop 

तो फिर तुम कमांड लाइन से

sudo initctl emit workers-stop 

कॉल कर सकते हैं आप समान घटना कार्यकर्ताओं शुरू करने के लिए जोड़ सकते हैं:

+1

ग्रेट, मेरे लिए काम किया! –

1

एक और घटना worker.conf को जोड़ने पर विचार करें। सभी श्रमिकों को पुनरारंभ करने के लिए एक ऐसा कार्य तैयार करें जो श्रमिकों को रोक देगा और फिर कार्यकर्ताओं को शुरू करेगा।

0

अनिवार्य रूप से आप एक प्रक्रिया है कि सभी अपने N=1, N=2 संयोजन के लिए कई stop और start आदेशों को निष्पादित करता है की आवश्यकता है।

ऐसा करने का एक आसान तरीका forexec script स्टांजा के अंदर कुछ लूप है। हालांकि, अगर प्रक्रियाओं को रोकने के लिए कुछ समय लगता है (उदाहरण के लिए क्योंकि वे किसी चीज़ पर काम कर रहे हैं और वे SIGTERM को अपने वर्तमान काम को संसाधित करने के बाद स्वीकार कर रहे हैं) यह अक्षम है क्योंकि आपको अगले को सिग्नल भेजने से पहले रोकने के लिए इंतजार करना होगा ।

इसलिए, मैं एक नवोदय स्क्रिप्ट https://github.com/elifesciences/builder-base-formula/blob/master/elife/config/etc-init-multiple-processes-parallel.conf

पर समानांतर में उन्हें बंद हो जाता है स्क्रिप्ट प्रक्रिया नामों में से एक नक्शे के कितने देखते हैं करने के लिए इनपुट के रूप में उपयोग करते हुए नमक द्वारा संकलित किया गया है का निर्माण किया। यहां एक नमूना परिणाम है:

description "(Re)starts all instances, in parallel" 
# http://upstart.ubuntu.com/cookbook/#start-on 
start on (local-filesystems and net-device-up IFACE!=lo) 
task 
script 
    timeout=300 
    echo "--------" 

    echo "Current status of 5 elife-bot-worker processes" 
    echo "Now is" $(date -Iseconds) 
    for i in `seq 1 5` 
    do 
     status elife-bot-worker ID=$i || true 
    done 
    echo "Stopping asynchronously 5 elife-bot-worker processes" 
    echo "Now is" $(date -Iseconds) 
    for i in `seq 1 5` 
    do 
     (stop elife-bot-worker ID=$i &) || true 
    done 

    for i in `seq 1 5` 
    do 
     echo "Waiting for elife-bot-worker $i to stop" 
     echo "Now is" $(date -Iseconds) 
     counter=0 
     while true 
     do 
      if [ "$counter" -gt "$timeout" ] 
      then 
       echo "It shouldn't take more than $timeout seconds to kill all the elife-bot-worker processes" 
       exit 1 
      fi 
      status elife-bot-worker ID=$i 2>&1 | grep "Unknown instance" && break 
      sleep 1 
      counter=$((counter + 1)) 
     done 
    done 
    echo "Stopped all elife-bot-worker processes" 

    echo "Starting 5 elife-bot-worker processes" 
    for i in `seq 1 5` 
    do 
     start elife-bot-worker ID=$i 
    done 
    echo "Started 5 elife-bot-worker processes" 

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