Wenn ich einen Python-Daemon schreibe, fange ich alle Ausnahmen ab und werfe sie dann in die Protokolldatei. Ich benutze es nicht nur zum Debuggen, sondern auch in der Produktion. Ich habe ein kleines Skript, das ich jeden Morgen ausführe und das nach Störungen in den Protokollen sucht.
Es hilft natürlich auch dabei, den Daemon am Laufen zu halten.
Einige Beispielcodes (ich entferne die nicht interessanten Teile):
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)
Wobei actua () der eigentliche Daemon ist (er schreibt auch, um zu protokollieren). Beachten Sie, dass ich auch eine DEBUG-Variable in einer Einstellungsdatei habe. Wenn dies der Fall ist, wird der Dämon nicht gegabelt, sodass er auf der Konsole ausgeführt wird.
Daemons
Daemons sind das Unix-Äquivalent zu Windows-Diensten. Dies sind Prozesse, die unabhängig von anderen Prozessen im Hintergrund ausgeführt werden. Das bedeutet, dass ihr Vater normalerweise init ist und dass sie sich von jedem tty lösen. Da sie unabhängig sind, gibt es keinen vordefinierten Ort für die Ausgabe.
Es gibt viele Python-Bibliotheken und Snippets, um einen Daemon zu erstellen. Im obigen Beispiel verwende ich meine eigene Funktion, die einige Ideen aus den Versionen von Steinar Knutsens und Jeff Kunces kombiniert. Es ist so einfach wie möglich, beachte, dass ich zweimal gabele .
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()