कैसे सुनिश्चित करें कि एक एप्लिकेशन लिनक्स पर चलता रहता है


83

मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि एक स्क्रिप्ट एक विकास सर्वर पर चल रही है। यह आँकड़ों से टकराता है और एक वेब सेवा प्रदान करता है, इसलिए इसे कायम रखना चाहिए, फिर भी दिन में कई बार यह अज्ञात कारणों से मर जाता है। जब हम ध्यान देते हैं कि हम इसे फिर से लॉन्च करते हैं, लेकिन यह रियर में एक दर्द है और कुछ उपयोगकर्ताओं को इसे लॉन्च करने की अनुमति (या पता नहीं) नहीं है।

मुझ में प्रोग्रामर समस्या की तह तक पहुंचने में कुछ घंटे बिताना चाहता है, लेकिन मुझमें व्यस्त व्यक्ति को लगता है कि एक ऐप नहीं चल रहा है, और इसे फिर से लॉन्च करने का पता लगाने का एक आसान तरीका होना चाहिए।

मुझे पता है कि मैं grep के माध्यम से क्रॉन-स्क्रिप्ट ps कर सकता हूं :

ps -A | grep appname

लेकिन फिर से, मेरे जीवन का एक और घंटा कुछ ऐसा करने पर व्यर्थ है जो पहले से मौजूद है ... क्या कोई पूर्व-निर्मित ऐप नहीं है जिसे मैं एक निष्पादन योग्य (तर्क के साथ वैकल्पिक रूप से) पास कर सकता हूं और यह एक प्रक्रिया को अनिश्चित काल तक चालू रखेगा?

मामले में कोई फर्क नहीं पड़ता, यह उबंटू है।


1
यह इस बात पर निर्भर करता है कि स्क्रिप्ट चालू नहीं होने पर आँकड़े खो जाते हैं, लेकिन मुझे लगता है कि आप में प्रोग्रामर सही है - आपको यह पता लगाना चाहिए कि स्क्रिप्ट अनिश्चित काल तक क्यों नहीं चलती है।
जोनाथन लेफ़लर

1
यह लगातार घटती संख्याओं की तुलना में ऑन-डिमांड सेवा उपयोगिता से अधिक है। यदि यह डेटा को बचाने से पहले दुर्घटनाग्रस्त हो जाता है, तो कुछ भी नहीं खोता है; अगली बार जब यह चलेगा तो यह काम पूरा कर लेगा।
ओली


इस सवाल का जवाब init.d द्वारा शुरू की गई जीवित प्रक्रिया को बनाए रखने के लिए मानक या सर्वोत्तम तरीके से किया गया था । समाधान में सिस्टमड और का उपयोग करना शामिल है /etc/inittab
कोपरपोपर

जवाबों:


37

सूचना: अपस्टार्ट रखरखाव मोड में है और उबंटू द्वारा छोड़ दिया गया था जो सिस्टमड का उपयोग करता है। सेवा की परिभाषा लिखने के तरीके के लिए सिस्टम के मैनुअल की जांच करनी चाहिए ।

चूंकि आप उबंटू का उपयोग कर रहे हैं, इसलिए आपको अपस्टार्ट में दिलचस्पी हो सकती है , जिसने पारंपरिक sysV init को बदल दिया है । एक प्रमुख विशेषता यह है कि अगर यह अप्रत्याशित रूप से मर जाता है तो यह एक सेवा को फिर से शुरू कर सकता है। फेडोरा ऊपर की ओर चला गया है, और डेबियन प्रयोगात्मक में है, इसलिए यह देखने लायक हो सकता है।

यह इस स्थिति के लिए ओवरकिल हो सकता है, हालांकि क्रोन स्क्रिप्ट को लागू करने में 2 मिनट लगेंगे।

#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
    invoke-rc.d yourapp start
fi

मुझे ध्यान देना चाहिए कि आपकी सेवा को प्रबंधित करने और इसे चालू रखने के लिए अपस्टार्ट को कॉन्फ़िगर करना काफी सरल है (आप छोटी कॉन्फिगर फाइल लिखते हैं)। यह समाधान किसी भी अन्य "सरल" क्रोन / शेल लिपियों पर आधारित निगरानी से अधिक स्वच्छ, सरल और बेहतर है।
थोर

@thor - (ध्यान दें, यह 2008 का है, जब अपस्टार्ट नया था, और डॉक्यूमेंटेशन का आना मुश्किल था)। मैं मानता हूं, "सरल" क्रोन स्क्रिप्ट सिर्फ यह वर्णन करने के लिए थी कि एक स्क्रिप्ट को काम करने के लिए जटिल होने की आवश्यकता नहीं है।
जिमब

समझा। मैंने वैसे भी आपके उत्तर को गलत ठहराया है, जब मेरी टिप्पणी
थॉर

85

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

#!/bin/bash
#make-run.sh
#make sure a process is always running.

export DISPLAY=:0 #needed if you are running a simple gui app.

process=YourProcessName
makerun="/usr/bin/program"

if ps ax | grep -v grep | grep $process > /dev/null
then
    exit
else
    $makerun &
fi

exit

फिर हर मिनट, या हर 5 मिनट में क्रोन जॉब जोड़ें।


2
वह जीनियस है। यह एक रिबूट और स्थापित करने के लिए कुछ भी नहीं बच जाएगा।
इयान पर्टन

मैंने इसे स्वयं उपयोग किया है क्योंकि इसे स्थापित करने के लिए रूट विशेषाधिकार की आवश्यकता नहीं है।
जॉनमुद

process nameयदि मैं पायथन स्क्रिप्ट को चालू रखना चाहता हूं तो क्या होगा ?
यूजर

@ उपयोगकर्ता ps ax | grep XXXकेवल आपकी प्रक्रिया को सूचीबद्ध करने के लिए उपयोग करें , फिर XXX यह होगा।
स्ट्रोंगविलो

11
क्रोन वन-लाइनर के रूप में, एक मिनट में एक बार चलाएं:* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
ACK_stoverflow

43

मोनेट इसके लिए एकदम सही है :)

आप साधारण कॉन्फिग फाइल लिख सकते हैं, जो मोनिट को टीसीपी पोर्ट, पीआईडी ​​फाइल आदि देखने के लिए कहती है

मॉनेट एक कमांड चलाएगा जिसे आप निर्दिष्ट करेंगे जब यह निगरानी कर रहा है प्रक्रिया अनुपलब्ध है / बहुत अधिक मेमोरी का उपयोग कर रहा है / बहुत लंबे समय तक / आदि के लिए सीपीयू पेगिंग कर रहा है। यह आपको बताए गए ईमेल अलर्ट को भी बताएगा कि क्या हुआ और क्या इसके बारे में कुछ भी किया जा सकता है।

जब हम कुछ गलत हो रहा हो, तो हमें शुरुआती चेतावनी देते हुए हम अपनी वेबसाइटों का लोड बनाए रखने के लिए इसका उपयोग करते हैं।

- आपका वफादार कर्मचारी, मोनीत


19
आप मोनीत को कैसे चलाती हैं?
जॉनमुद्द

2
यह सीखना बहुत कठिन है। मैं सिर्फ एक स्क्रिप्ट (एक सेवा के बजाय) को फिर से शुरू करना चाहता हूं और मैंने इसके डॉक को घंटों तक पढ़ा लेकिन इसका पता नहीं लगा सका।
टायलर लॉन्ग

21

यदि आप सिस्टम-आधारित डिस्ट्रो जैसे फेडोरा और हाल के उबंटू रिलीज़ का उपयोग कर रहे हैं, तो आप सेवाओं के लिए सिस्टमड की "रीस्टार्ट" क्षमता का उपयोग कर सकते हैं । इसे सिस्टम सेवा के रूप में या उपयोगकर्ता सेवा के रूप में सेटअप किया जा सकता है यदि इसे किसी विशेष उपयोगकर्ता द्वारा प्रबंधित और चलाने की आवश्यकता है, जो ओपी की विशेष स्थिति में होने की अधिक संभावना है।

पुनः प्रारंभ विकल्प में से एक लेता है no , on-success, on-failure, on-abnormal, on-watchdog, on-abort, या always

इसे एक उपयोगकर्ता के रूप में चलाने के लिए, बस निम्नलिखित की तरह एक फ़ाइल रखें ~/.config/systemd/user/something.service:

[Unit]
Description=Something

[Service]
ExecStart=/path/to/something
Restart=on-failure

[Install]
WantedBy=graphical.target

फिर:

systemctl --user daemon-reload
systemctl --user [status|start|stop|restart] something

कोई रूट विशेषाधिकार / सिस्टम फ़ाइलों की आवश्यकता के संशोधन, कोई क्रॉन नौकरियों की जरूरत नहीं है, कुछ भी स्थापित नहीं है, नरक के रूप में लचीला है (प्रलेखन में सभी संबंधित सेवा विकल्प देखें)।

प्रति-उपयोगकर्ता सिस्टमड उदाहरण का उपयोग करने के बारे में अधिक जानकारी के लिए https://wiki.archlinux.org/index.php/Systemd/User भी देखें ।


शानदार जवाब, लेकिन ~ / .config / systemd / user / something.service था, मेरे लिए, थोड़ा अस्पष्ट। "उपयोगकर्ता" भाग का शाब्दिक अर्थ "उपयोगकर्ता" है या "आपका नाम" जैसा है? यदि यह "आपका नाम" है, तो यह मुझे बेमानी लगता है, क्योंकि आप इस फाइल को अपने होम डायरेक्टरी में बना रहे हैं। संपादित करें: ऐसा लगता है कि यह सचमुच "उपयोगकर्ता" है
fivedogit

8

मैंने क्रॉन "किलॉल -0 प्रोग्रामनाम || /etc/init.d/programname start" से उपयोग किया है। यदि प्रक्रिया मौजूद नहीं है तो किल त्रुटि करेगा। यदि यह मौजूद है, तो यह प्रक्रिया को एक अशक्त संकेत देगा (जिसे कर्नेल अनदेखा करेगा और पास होने से परेशान नहीं होगा)।

इस मुहावरे को याद करना सरल है (IMHO)। आम तौर पर मैं इसका उपयोग तब करता हूं जब मैं अभी भी यह जानने की कोशिश कर रहा हूं कि सेवा स्वयं विफल क्यों हो रही है। IMHO एक कार्यक्रम बस अप्रत्याशित रूप से गायब नहीं होना चाहिए :)


7

अपने रन को लूप में डालें- इसलिए जब यह बाहर निकलता है, तो यह फिर से चलता है ... जबकि (सच) {मेरे ऐप को चलाएं ..}


4
यदि स्क्रिप्ट अज्ञात कारणों से मर रही है, तो संभावना है कि यह लूप स्क्रिप्ट को भी रद्द कर देगी, नहीं?
गारेथ

4
गराथ के साथ Im, अगर इसकी प्रणाली लंबे समय तक चलने वाली प्रक्रियाओं को मारती है, तो सुझाए गए लूप - जो ऐप से पहले शुरू होंगे - पहले मारे जाएंगे।
ekerner

2
आपकी दो टिप्पणियों का उत्तर देने के लिए: नहीं, यदि स्क्रिप्ट अज्ञात कारणों से मर रही है, तो लूप स्क्रिप्ट अप्रभावित है क्योंकि यह एक अलग प्रक्रिया में चलाया जाता है- लेकिन हाँ, यदि सिस्टम बेतरतीब ढंग से लंबी चलने वाली प्रक्रियाओं को मार रहा है, तो यह अभी भी एक समस्या होगी - हालांकि मुझे संदेह है कि मामला है। बाकी प्रणाली को प्रभावित नहीं बताया गया था और लंबे समय से चल रही अन्य प्रक्रियाओं से भरा हुआ है जिन्हें फिर से शुरू किया गया होगा (केवल इस एक स्क्रिप्ट में समस्या होने का उल्लेख है)।
क्लैत्ज़ाज़्ट

4

मैं किसी कारण से काम करने के लिए क्रिस वेंडेट समाधान नहीं प्राप्त कर सका , और यह डिबग करना कठिन था। यह एक बहुत अधिक समान है, लेकिन डिबग करना आसान है, पैटर्न मिलान से बैश को बाहर करता है। डीबग करने के लिए बस चलाएँ bash ./root/makerun-mysql.sh:। Mysql-server के साथ निम्नलिखित उदाहरण में, बस processऔर makerunआपकी प्रक्रिया के लिए चर के मूल्य को बदलें ।

  • इस तरह एक BASH- स्क्रिप्ट बनाएं ( nano /root/makerun-mysql.sh):
#!/bin/bash
process="mysql"
makerun="/etc/init.d/mysql restart"
if ps ax | grep -v grep | grep -v bash | grep --quiet $process
then
    printf "Process '%s' is running.\n" "$process"
    exit
else
    printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun"
    $makerun
fi
exit
  • सुनिश्चित करें कि यह उचित फ़ाइल अनुमतियाँ (यानी chmod 700 /root/makerun-mysql.sh) जोड़कर निष्पादन योग्य है

  • फिर इसे अपने कोंट्राब ( crontab -e) में जोड़ें:

# Keep processes running every 5 minutes
*/5 * * * * bash /root/makerun-mysql.sh

1
ध्यान दें, क्रिस वेंडट के समाधान की तुलना में, यहां स्क्रिप्ट पृष्ठभूमि कार्य के रूप में शुरू नहीं हुई है।
मेसन

2

इस superviseउपकरण से daemontoolsमेरी प्राथमिकता होगी - लेकिन फिर सब कुछ दान जे बर्नस्टीन लिखते हैं मेरी प्राथमिकता :)

http://cr.yp.to/daemontools/supervise.html

आपको अपने एप्लिकेशन स्टार्टअप स्क्रिप्ट के लिए एक विशेष निर्देशिका संरचना बनानी होगी, लेकिन इसका उपयोग करना बहुत सरल है।


1

सबसे पहले, आप इस ऐप को कैसे शुरू करते हैं? क्या यह खुद को पृष्ठभूमि के लिए कांटा है? क्या यह nohup के साथ शुरू हुआ है .. & etc? यदि यह बाद वाला है, तो जांचें कि यह nohup.out में क्यों मर गया, यदि यह पहला है, तो लॉगिंग बनाएं।

अपने मुख्य प्रश्न के रूप में: आप इसे क्रोन कर सकते हैं, या पृष्ठभूमि पर एक और प्रक्रिया चला सकते हैं (सबसे अच्छा विकल्प नहीं) और एक बाशस्क्रिप्ट में पिडोफ़ का उपयोग करें, काफी आसान:

if [ `pidof -s app` -eq 0 ]; then
    nohup app &
fi

1

आप इसे इनटैब से लॉन्च की गई सेवा बना सकते हैं (हालांकि कुछ लिनक्स /etc/event.d में कुछ नए पर चले गए हैं)। सिस्टम में निर्मित ये सुनिश्चित करते हैं कि आपकी सेवा आपकी अपनी स्क्रिप्ट लिखे बिना या कुछ नया स्थापित किए बिना चलती रहे।


1

यह एक DMD (डेमन मॉनीटरिंग डेमॉन) के लिए एक नौकरी है। आसपास कुछ हैं; लेकिन मैं आमतौर पर एक स्क्रिप्ट लिखता हूं जो यह जांचता है कि क्या डेमन चल रहा है, और यदि नहीं, तो चलाएं और हर मिनट चलाने के लिए क्रोन में डालें।



1

ऐसा करने का एक अच्छा, सरल तरीका इस प्रकार है:

  1. मरने के लिए अपने सर्वर को लिखें अगर यह उम्मीद करता है कि यह बंदरगाह पर नहीं सुन सकता है
  2. हर मिनट अपने सर्वर को लॉन्च करने का प्रयास करने के लिए एक क्रोनजॉब सेट करें

अगर यह नहीं चल रहा है तो यह शुरू हो जाएगा, और अगर यह चल रहा है तो यह नहीं होगा। किसी भी स्थिति में, आपका सर्वर हमेशा ऊपर रहेगा।


0

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

यदि आप चाहते हैं कि यदि Apache OK है तो परीक्षण करें, तो एक साधारण वेब पेज डाउनलोड करने का प्रयास करें, और यदि आपका यूनिक कोड आउटपुट में है तो परीक्षण करें।

यदि नहीं, तो अपाचे को -9 से मारें और फिर पुनरारंभ करें। और रूट को एक मेल भेजें (जो कि कंपनी / सर्वर / प्रोजेक्ट की जड़ों को अग्रेषित मेल एड्रेस है)।


1
यह सच है। अन्य उत्तरों में सुझाए गए बहुत सारे निगरानी समाधान प्रोटोकॉल-निगरानी प्रदान करते हैं।
ओली

0

यह और भी सरल है:

#!/bin/bash

export DISPLAY=:0

process=processname
makerun="/usr/bin/processname"

if ! pgrep $process > /dev/null
then
    $makerun &
fi

आपको याद रखना होगा कि यह सुनिश्चित करने के लिए कि प्रक्रियानाम अद्वितीय है।

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