PID-files, crons, या ऐसी अन्य चीज़ों से बचें जो उन प्रक्रियाओं का मूल्यांकन करने की कोशिश करती हैं जो उनके बच्चे नहीं हैं।
एक बहुत अच्छा कारण है कि यूनिक्स में, आप केवल अपने बच्चों पर इंतजार कर सकते हैं। किसी भी विधि (पीएस पार्सिंग, पीजीआरईपी, एक पीआईडी, ... का भंडारण) जो कि आसपास काम करने की कोशिश करता है वह त्रुटिपूर्ण है और इसमें छेद करने वाले छेद हैं। बस ना कहना ।
इसके बजाय आपको उस प्रक्रिया की आवश्यकता है जो प्रक्रिया को आपके माता-पिता बनने की प्रक्रिया की निगरानी करती है। इसका क्या मतलब है? इसका मतलब केवल यह है कि आपकी प्रक्रिया शुरू होने वाली प्रक्रिया समाप्त होने के लिए मज़बूती से इंतजार कर सकती है। बैश में, यह बिल्कुल तुच्छ है।
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
बैश कोड का उपरोक्त टुकड़ा लूप myserver
में चलता है until
। पहली पंक्ति शुरू होती है myserver
और इसके खत्म होने का इंतजार करती है। जब यह समाप्त हो जाता है, तो until
इसकी निकास स्थिति की जांच करता है। यदि निकास की स्थिति है 0
, तो इसका मतलब है कि यह इनायत से समाप्त हो गया है (जिसका अर्थ है कि आपने इसे किसी तरह बंद करने के लिए कहा था, और इसने सफलतापूर्वक ऐसा किया)। उस स्थिति में हम इसे पुनः आरंभ नहीं करना चाहते हैं (हमने इसे बंद करने के लिए कहा है!)। यदि बाहर निकलने की स्थिति नहीं है 0
, until
तो लूप बॉडी चलाएगा, जो STDERR पर एक त्रुटि संदेश देता है और 1 सेकंड के बाद लूप (पंक्ति 1 पर वापस) को पुनरारंभ करता है ।
हम एक सेकंड इंतजार क्यों करते हैं? क्योंकि यदि स्टार्टअप अनुक्रम के साथ कुछ गलत है myserver
और यह तुरंत क्रैश हो जाता है, तो आपके हाथों पर लगातार पुनरारंभ और दुर्घटनाग्रस्त होने का एक बहुत ही गहन लूप होगा। sleep 1
कि से तनाव दूर ले जाता है।
अब आपको बस इतना करना है कि इस बैश स्क्रिप्ट को शुरू करें (एसिंक्रोनस रूप से, शायद), और यह निगरानी करेगा और इसे myserver
आवश्यक रूप से पुनरारंभ करेगा । यदि आप बूट पर मॉनिटर शुरू करना चाहते हैं (सर्वर को "जीवित" रिबूट बनाते हैं), तो आप इसे एक @reboot
नियम के साथ अपने उपयोगकर्ता के क्रोन (1) में शेड्यूल कर सकते हैं । इसके साथ अपने क्रोन नियम खोलें crontab
:
crontab -e
फिर अपनी मॉनिटर स्क्रिप्ट शुरू करने के लिए एक नियम जोड़ें:
@reboot /usr/local/bin/myservermonitor
वैकल्पिक रूप से, Inittab (5) और / etc / inittab को देखें। आप myserver
एक निश्चित इनिट स्तर पर शुरू करने के लिए एक लाइन जोड़ सकते हैं और स्वचालित रूप से रिस्पांड हो सकते हैं।
संपादित करें।
मुझे पीआईडी फ़ाइलों का उपयोग न करने के बारे में कुछ जानकारी जोड़ने दें । जबकि वे बहुत लोकप्रिय हैं; वे भी बहुत त्रुटिपूर्ण हैं और कोई कारण नहीं है कि आप इसे सही तरीके से नहीं करेंगे।
इस पर विचार करो:
पीआईडी रीसाइक्लिंग (गलत प्रक्रिया को मारना):
/etc/init.d/foo start
: शुरू करें foo
, foo
पीआईडी को लिखें/var/run/foo.pid
- थोड़ी देर बाद:
foo
किसी तरह मर जाता है।
- थोड़ी देर बाद: कोई भी यादृच्छिक प्रक्रिया जो शुरू होती है (इसे कॉल करें
bar
) एक यादृच्छिक पीआईडी लेती है, कल्पना करें कि यह foo
पुरानी पीआईडी है।
- आप देखते हैं
foo
: /etc/init.d/foo/restart
पढ़ता है /var/run/foo.pid
, यह देखने के लिए जाँच करता है कि क्या यह अभी भी जीवित है, पाता है bar
, यह सोचता है foo
, इसे मारता है, एक नई शुरुआत करता है foo
।
पीआईडी फाइलें बासी हो जाती हैं। आपको अधिक जटिल (या मुझे कहना चाहिए, गैर-तुच्छ) तर्क की जांच करने के लिए कि क्या पीआईडी फ़ाइल बासी है, और ऐसा कोई भी तर्क फिर से कमजोर है 1.
।
क्या होगा यदि आपके पास लिखने की पहुंच नहीं है या केवल पढ़ने के लिए वातावरण में हैं?
यह व्यर्थ है ओवरकम्प्लिकेशन; देखें कि ऊपर मेरा उदाहरण कितना सरल है। कोई जटिल करने की जरूरत नहीं है, बिल्कुल।
यह भी देखें: क्या 'सही' करते समय पीआईडी-फाइलें अभी भी त्रुटिपूर्ण हैं?
वैसे; PID फ़ाइलों से भी बदतर पार्सिंग है ps
! ऐसा कभी मत करो।
ps
बहुत ही अस्थिर है। जब आप इसे लगभग हर यूनिक्स प्रणाली पर पाते हैं; यदि आप गैर-मानक आउटपुट चाहते हैं तो इसके तर्क बहुत भिन्न हैं। और मानक उत्पादन केवल मानव उपभोग के लिए है, स्क्रिप्टेड पार्सिंग के लिए नहीं!
- पार्स
ps
करने से झूठे सकारात्मक का एक बहुत होता है। ps aux | grep PID
उदाहरण लें , और अब कल्पना करें कि कोई व्यक्ति एक संख्या के साथ एक प्रक्रिया शुरू कर सकता है, जो तर्क के रूप में होता है कि पीआईडी के समान ही आप अपने डेमन के साथ घूरते थे! एक एक्स सत्र शुरू करने वाले दो लोगों की कल्पना करें और आप एक्स को मारने के लिए आपका स्वागत कर रहे हैं। यह हर तरह का बुरा है।
यदि आप स्वयं प्रक्रिया का प्रबंधन नहीं करना चाहते हैं; वहाँ कुछ पूरी तरह से अच्छे सिस्टम हैं जो आपकी प्रक्रियाओं के लिए मॉनिटर के रूप में कार्य करेंगे। उदाहरण के लिए, रनिट में देखें ।