जब मैं एक अजगर डेमन लिखता हूं तो मैं सभी अपवादों को पकड़ता हूं और फिर लॉग फाइल में फेंक देता हूं। मैं न केवल डिबग के लिए उपयोग करता हूं, बल्कि उत्पादन में भी। मेरे पास एक छोटी सी स्क्रिप्ट है जिसे मैं हर सुबह चलाता हूं जो लॉग में परेशान होती है।
यह निश्चित रूप से डेमन को चालू रखने में मदद करता है।
कुछ नमूना कोड (मैं दिलचस्प हिस्सों को नहीं हटाता):
import logging
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
filename=LOG_FILE,
filemode='w')
logging.info("Sincrod inicializado")
if not DEBUG:
daemonize()
while True:
try:
actua()
except:
logging.error(sys.exc_info())
if (datetime.datetime.now().hour > NOITE_EMPEZA\
and datetime.datetime.now().hour < NOITE_REMATA):
time.sleep(INTERVALO_NOITE)
else:
time.sleep(INTERVALO_DIA)
जहां एक्टुआ () असली डेमॉन है (यह लॉग करने के लिए लिखता है)। ध्यान दें कि मेरे पास सेटिंग फ़ाइल में एक DEBUG चर भी है, जब यह सत्य है, तो मैं डेमॉन को कांटा नहीं करता हूं, इसलिए यह कंसोल पर निष्पादित होता है।
डेमॉन
Daemons विंडोज़ सेवाओं के बराबर यूनिक्स हैं। वे ऐसी प्रक्रियाएं हैं जो अन्य प्रक्रियाओं से स्वतंत्र पृष्ठभूमि में चलती हैं। इसका मतलब है कि उनके पिता आमतौर पर अयोग्य हैं, और वे किसी भी प्रकार से अलग हो जाते हैं। जैसा कि वे स्वतंत्र हैं, उनके उत्पादन को लगाने के लिए कोई पूर्वनिर्धारित जगह नहीं है।
एक डेमॉन बनाने के लिए बहुत सारे अजगर पुस्तकालय और स्निपेट्स हैं, ऊपर के उदाहरण में मैं अपने स्वयं के फ़ंक्शन का उपयोग करता हूं, जो कि स्टीयरन नट्सेंस और जेफ कुन्स संस्करणों से कुछ विचारों को जोड़ती है। यह जितना संभव हो उतना सरल है, ध्यान दें कि मैंने दो बार कांटा ।
def daemonize():
"""Forks this process creating a daemon and killing the original one"""
if (not os.fork()):
# get our own session and fixup std[in,out,err]
os.setsid()
sys.stdin.close()
sys.stdout = NullDevice()
sys.stderr = NullDevice()
if (not os.fork()):
# hang around till adopted by init
ppid = os.getppid()
while (ppid != 1):
time.sleep(0.5)
ppid = os.getppid()
else:
# time for child to die
os._exit(0)
else:
# wait for child to die and then bail
os.wait()
sys.exit()