Bir python arka plan programı yazarken tüm istisnaları yakalarım ve sonra günlük dosyasına atarım. Sadece hata ayıklama için değil, üretimde de kullanıyorum. Her sabah, günlüklerde üzücü bir şey arayan küçük bir senaryom var.
Elbette bu daemon'u çalışır halde tutmaya da yardımcı olur.
Bazı örnek kod (ilginç olmayan parçaları kaldırırım):
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 () gerçek daemon (burada da günlüğe yazar). Ayrıca, ayarlar dosyasında bir DEBUG değişkeni olduğunu unutmayın, Doğru olduğunda, arka plan programı çatalla çalıştırmıyorum, böylece konsolda yürütülür.
Cinler
Arka plan pencereleri, Windows hizmetlerine eşdeğer unix'tir. Diğer süreçlerden bağımsız olarak arka planda çalışan süreçlerdir. Bu, babalarının genellikle init olduğu ve herhangi bir tty'den ayrıldığı anlamına gelir. Bağımsız oldukları için çıktılarını koymak için önceden tanımlanmış bir yer yoktur.
Bir daemon yapmak için çok sayıda python kütüphanesi ve parçacığı var, yukarıdaki örnekte Steinar Knutsens ve Jeff Kunces versiyonlarından bazı fikirleri birleştiren kendi fonksiyonumu kullanıyorum. Mümkün olduğunca basit, iki kez çatallandığımı unutmayın .
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()