Когда я пишу питона демон Я ловлю все исключения и бросить затем в лог-файл. Я использую не только для отладки, но и в производстве. У меня есть небольшой скрипт, который я запускаю каждое утро, который ищет что-то огорчающее в журналах.
Конечно, это также помогает поддерживать работу демона.
Пример кода (я удаляю не интересные части):
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, я не разветвляю демона, поэтому он запускается на консоли.
Демоны
Демоны - это Unix, эквивалентный службам Windows. Это процессы, которые работают в фоновом режиме независимо от других процессов. Это означает, что их отец обычно init, и они отделены от любого tty. Поскольку они независимы, нет предопределенного места для размещения их вывода.
Существует множество библиотек python и фрагментов кода для создания демона. В приведенном выше примере я использую свою собственную функцию, которая объединяет некоторые идеи из версий 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()