दुर्घटनाग्रस्त प्रक्रियाओं को फिर से शुरू करने का सरल तरीका?


10

मुझे अपने वेबसर्वर पर चलने वाली कई प्रक्रियाओं की निगरानी करने की आवश्यकता है। किसी कारण से, वार्निश वर्तमान में हर दिन या दो बार दुर्घटनाग्रस्त हो जाता है। मैं मोनिट का उपयोग स्वतः वार्निश को पुनरारंभ करने के लिए कर रहा हूं, लेकिन यह काम नहीं करता है। यहाँ वार्निश के लिए मेरी monit.conf प्रविष्टि है।

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

लॉग फ़ाइल से पता चलता है कि वार्निश चलना बंद हो जाने के बाद, पुनः आरंभ करने का प्रयास विफल हो जाता है। फिर अंततः मॉनेट वार्निश की निगरानी करना बंद कर देता है।

किसी के पास सुझाव है कि मैं इसे कैसे ठीक कर सकता हूं? या बेहतर अभी तक, आप स्वचालित रूप से निगरानी और दुर्घटनाग्रस्त प्रक्रियाओं को फिर से शुरू करने के अन्य सरल तरीके सुझा सकते हैं? धन्यवाद!


मैं नहीं मानता कि पूर्व-व्यवस्था के समय में ऐसी चीजें कितनी कठिन थीं।
Fl0v0

जवाबों:


17

मैं daemontools ( http://cr.yp.to/daemontools.html ) को देखता हूँ ।

पर्यवेक्षण इस उद्देश्य के लिए बनाया गया था - प्रक्रियाओं को शुरू करने और उन्हें देखने के लिए, यदि वे कभी भी समाप्त होते हैं, तो उन्हें तुरंत पुनः आरंभ करें।

आप अभी भी मॉनेट का उपयोग कर सकते हैं यदि आपको एक सरल से अधिक जटिल कुछ भी करने की आवश्यकता है "क्या यह अभी भी चल रहा है" चेक, और यदि प्रक्रिया को फिर से शुरू करने की आवश्यकता है, तो पर्यवेक्षण के माध्यम से ऐसा करें।


अस्थिर सेवाओं की प्रक्रियाओं की निगरानी के लिए मैं डेमोनटूल का भी उपयोग करता हूं। काफी आसान है अगर मुझे कहना था। :-)
इडोमोर


2

यदि आप सेवाओं को पुनः आरंभ करने के लिए आपके पास नागोस के साथ ईवेंट हैंडलर स्क्रिप्ट का उपयोग कर सकते हैं ।

यदि वार्निश को आरंभ करने के लिए रूट अनुमति की आवश्यकता होती है (init.d स्क्रिप्ट आमतौर पर करते हैं) "/etc/init.d/varnish start" को "sudo /etc/init.d/varnish start" में बदल दें। लेकिन यह संभवत: पर्याप्त नहीं होगा क्योंकि आप संभवतः सभी कमांडों को कुल sudo nopasswd विशेषाधिकारों के रूप में जो भी उपयोगकर्ता मोनिट रन देना चाहते हैं, और एक शेल स्क्रिप्ट को sudo देना मूल रूप से उतना ही बुरा होगा। तो आपको यह पता लगाने की आवश्यकता है कि उस init स्क्रिप्ट में कौन सी कमांड्स को sudo की आवश्यकता है, उन कमांड sudo विशेषाधिकार को / etc / sudoers फ़ाइल में monit user को दें, और अंत में उस init स्क्रिप्ट को तदनुसार संपादित करें। या हो सकता है कि इन सब के बजाय वार्निश को गैर-रूट उपयोगकर्ता के रूप में चलाया जा सकता है?

अंत में, मुझे यकीन है कि आप यह जानते हैं लेकिन मैं इसे वैसे भी कहने जा रहा हूं। आप स्पष्ट रूप से इसमें बहुत प्रयास कर रहे हैं, मुझे आशा है कि आप यह जानने में अधिक प्रयास कर रहे हैं कि वार्निश दुर्घटनाग्रस्त क्यों हो रहा है और वास्तव में इसे ठीक कर रहा है (या डेवलपर्स को पता लगाने के लिए हाउंडिंग क्यों है) :-)

अद्यतन:
यह उतना साफ नहीं हो सकता है, लेकिन इसे जड़ के रूप में प्राप्त करने का एक आसान तरीका एक स्क्रिप्ट स्थापित करना हो सकता है जो यह जांचता है कि क्या प्रक्रिया ठीक है, और यदि यह शुरू नहीं होती है। फिर उस स्क्रिप्ट को हर दो मिनट में क्रोन जॉब के रूप में चलाएं।


मैंने पहली बार नागियोस पर विचार किया, लेकिन अपने उद्देश्यों के लिए कुछ छोटा और सरल चाहता था। और हां, मैं वार्निश मुद्दे पर गौर कर रहा हूं। मेरा एक सर्वर बहुत लंबे समय से इसे स्थिर कर रहा है, इसलिए यह निश्चित रूप से मेरे साथ ही होता है। :(
लिन

1

StackOverflow से लिया गया एक और बढ़िया तरीका :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

इसे क्रस्टैब में जोड़ा जा सकता है:

crontab -e

फिर अपनी मॉनिटर स्क्रिप्ट शुरू करने के लिए एक नियम जोड़ें:

@reboot /usr/local/bin/myservermonitor

या में एक स्क्रिप्ट के रूप में जोड़ा गया /etc/init.d

यह एक अच्छा दृष्टिकोण क्यों है, इस पर विस्तृत विवरण के लिए स्टैकऑवरफ्लो उत्तर देखें ।


0

मैं इस समस्या से निपटने का सबसे सरल तरीका भी ढूंढ रहा था। सबसे आसान तरीका है कि मैं टैग की अंतिम पंक्ति के रूप में Restart=allwaysसंबंधित .serviceफ़ाइल में जोड़ सकता हूं ।/etc/systemd/system/multi-user.target.wants/[service]

उसके बाद है sudo systemctl daemon-reloadजिसके बाद sudo systemctl restart service.serviceपरिवर्तन फिर से लोड करने।

आप जाँच कर सकते हैं कि क्या सेवा चल रही है:, systemctl status processnameप्रारंभ टाइमस्टैम्प की जाँच करें। उसके बाद ps -ef | grep servicename, विज्ञापन सिर्फ मिली आईडी के साथ प्रक्रिया को मारें kill 1234। उसके बाद systemctl status processnameफिर से करें और जांचें कि स्टार्ट टाइमस्टैम्प अपडेट है या नहीं।

इस पर काम करना चाहिए:

  • डेबियन 7 और डेबियन 8
  • उबंटू 15.04 और नया
  • सेंटोस 7 और वायदा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.