2010-04-26 9 views
5

इस पोस्ट का वर्णन करता है एक bash स्क्रिप्ट में जिंदा एक बच्चे की प्रक्रिया रखने के लिए कैसे:विफल होने पर एक पायथन स्क्रिप्ट को स्वत: पुनरारंभ कैसे करें?

How do I write a bash script to restart a process if it dies?

यह एक और bash स्क्रिप्ट फोन करने के लिए महान काम किया।

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

अब व्यवहार पूरी तरह से अलग है:

हालांकि, मैं कुछ इसी तरह जहां बच्चे प्रक्रिया Python स्क्रिप्ट है, daemon.py जो एक काँटेदार बच्चे प्रक्रिया है जो पृष्ठभूमि में चलता है बनाता है क्रियान्वित करने की कोशिश की। ऐसा लगता है कि पाइथन लिपि अब बैश स्क्रिप्ट का बच्चा नहीं है, लेकिन ऐसा लगता है कि बाश स्क्रिप्ट्स पीआईडी ​​'ले लिया गया है' - इसलिए अब स्क्रिप्ट के चारों ओर एक बाश रैपर नहीं है ... क्यों?

+3

यह जानने में मदद करेगा कि daemon.py में क्या है, लेकिन नाम से मैं अनुमान लगा रहा हूं कि यह "निष्पादन" करता है या जो कुछ भी पाइथन समकक्ष पृष्ठभूमि में रखना है। –

+0

...। डब्ल्यू एच एक टी? –

+0

daemon.py – chris

उत्तर

5

एक डिमन प्रक्रिया डबल-फोर्क, खुद को डिमोनिज़ करने का मुख्य बिंदु - इसलिए पीआईडी ​​कि माता-पिता की प्रक्रिया का कोई मूल्य नहीं है (यह बाल प्रक्रिया शुरू होने के तुरंत बाद चला गया है)।

इसलिए, एक डेमॉन प्रक्रिया को अपने पीआईडी ​​को "जाने-माने स्थान" में एक फ़ाइल में लिखना चाहिए, जहां सम्मेलन द्वारा माता-पिता प्रक्रिया जानता है कि इसे कहां से पढ़ना है; इस (पारंपरिक) दृष्टिकोण के साथ, माता-पिता की प्रक्रिया, अगर यह पुनरारंभ करने वाले वॉचडॉग के रूप में कार्य करना चाहती है, तो बस प्रसिद्ध स्थान से डेमॉन प्रक्रिया के पीआईडी ​​को पढ़ सकते हैं और समय-समय पर जांच कर सकते हैं कि डिमन अभी भी जीवित है या नहीं, और आवश्यकता होने पर इसे पुनरारंभ करें।

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

0

ऐसा लगता है कि व्यवहार पूरी तरह से अलग है क्योंकि यहां पृष्ठभूमि में आपका "daemon.py" लॉन्च किया गया है।

अन्य लिंक में आपने सर्वेक्षण की प्रक्रिया की ओर इशारा किया है एक डेमॉन नहीं है, यह पृष्ठभूमि में शुरू नहीं होता है। लॉन्चर बस हमेशा के लिए इंतजार कर रहा है कि बच्चे की प्रक्रिया बंद करो।

इस पर काबू पाने के कई तरीके हैं। परंपरागत स्थानों में कुछ पिड फ़ाइल का उपयोग करके शास्त्रीय एक तरीका @ एलेक्स समझाता है।

एक और तरीका है अपने चल डेमॉन अंदर प्रहरी का निर्माण और ... यह एक सही प्रक्रिया है कि यादृच्छिक (कुछ है कि हो नहीं होना चाहिए) पर नहीं टूटते अनुकरण करेंगे प्रहरी daemonize को हो सकता है ...

3

आपको पाइथन एन्हांसमेंट प्रस्ताव 3143 (पीईपी) here पर देखना चाहिए। इसमें बेन ने पाइथन मानक lib में एक डेमॉन लाइब्रेरी समेत सुझाव दिया है। वह डेमन्स के बारे में बहुत अच्छी जानकारी के बहुत सारे पर चला जाता है और यह एक बहुत ही आसान पढ़ा जाता है। संदर्भ कार्यान्वयन here है। 'https://github.com/ut0mt8/simple-ha' की

+0

संदर्भ पॉल के लिए धन्यवाद। उपयोगी लग रहा है। – chris

-1

उपयोग करें।

सरल-हा

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

जीवन बहुत आसान हो जाएगा!

+1

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –

+0

इंगित करने के लिए धन्यवाद। मैं इस एप को अपडेट करने का प्रयास करूंगा। –

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