เมื่อฉันเขียน python daemon ฉันจะตรวจจับข้อยกเว้นทั้งหมดแล้วโยนไปยังล็อกไฟล์ ฉันไม่เพียง แต่ใช้สำหรับการแก้ไขข้อบกพร่อง แต่ในการผลิตด้วย ฉันมีสคริปเล็ก ๆ ที่ฉันวิ่งทุกเช้าซึ่งมองหาบางสิ่งที่ไม่ดีในบันทึก
นอกจากนี้ยังช่วยในการทำให้ daemon ทำงานได้อย่างแน่นอน
โค้ดตัวอย่างบางส่วน (ฉันลบส่วนที่ไม่น่าสนใจ):
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)
โดยที่ actua () เป็นภูตจริง (มันเขียนไว้ในบันทึกด้วย) โปรดทราบว่าฉันมีตัวแปร DEBUG ในไฟล์การตั้งค่าเมื่อเป็น True ฉันไม่แยก daemon ดังนั้นจึงเรียกใช้งานบนคอนโซล
ภูต
Daemons เทียบเท่ายูนิกซ์กับบริการ windows พวกเขาเป็นกระบวนการที่ทำงานในพื้นหลังเป็นอิสระจากกระบวนการอื่น ๆ นั่นหมายความว่าพ่อของพวกเขามักจะประทับจิตและพวกเขาถูกแยกออกจาก tty เนื่องจากเป็นอิสระจึงไม่มีตำแหน่งที่กำหนดไว้ล่วงหน้าสำหรับการแสดงผล
มีไพ ธ อนไลบรารีและตัวอย่างจำนวนมากเพื่อสร้างดีมอนในตัวอย่างข้างต้นฉันใช้ฟังก์ชั่นของตัวเองซึ่งผสมผสานแนวคิดบางอย่างจาก Steinar Knutsens และ Jeff Kunces มันเป็นง่ายๆเป็นไปได้ทราบว่าผมแยกเป็นสองเท่า
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()