Ketika saya menulis daemon python saya menangkap semua pengecualian dan kemudian melemparkan ke file log. Saya tidak hanya menggunakan untuk debug, tetapi juga dalam produksi. Saya memiliki skrip kecil yang saya jalankan setiap pagi yang mencari sesuatu yang mengganggu dalam log.
Ini juga membantu menjaga daemon tetap berjalan, tentu saja.
Beberapa kode contoh (saya menghapus bagian yang tidak menarik):
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)
Di mana actua () adalah daemon yang sebenarnya (ia juga menulis untuk mencatat). Perhatikan bahwa saya juga memiliki variabel DEBUG dalam file pengaturan, ketika itu Benar, saya tidak garpu daemon sehingga dijalankan pada konsol.
Daemon
Daemon adalah unix yang setara dengan layanan windows. Mereka adalah proses yang berjalan di latar belakang independen dari proses lain. Itu berarti bahwa ayah mereka biasanya init, dan bahwa mereka terlepas dari segala tty. Karena mereka independen, tidak ada tempat yang telah ditentukan untuk memberikan hasil mereka.
Ada banyak pustaka python dan cuplikan untuk membuat daemon, dalam contoh di atas saya menggunakan fungsi saya sendiri, yang menggabungkan beberapa ide dari versi Steinar Knutsens dan Jeff Kunces. Sesederhana mungkin, perhatikan bahwa saya bercabang dua kali .
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()