আমি যখন পাইথন ডেমন লিখি তখন সমস্ত ব্যতিক্রম আমি ধরি এবং তারপরে লগ ফাইলে নিক্ষেপ করি। আমি কেবল ডিবাগের জন্যই ব্যবহার করি না, প্রযোজনায়ও। আমার এএএর একটি ছোট স্ক্রিপ্ট রয়েছে যা আমি প্রতি সকালে চালিত যা লগগুলিতে কিছু বিরক্তিকর সন্ধান করে।
এটি অবশ্যই ডেমন চালিয়ে যেতে সহায়তা করে।
কিছু নমুনা কোড (আমি আকর্ষণীয় অংশগুলি সরিয়ে নেই):
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)
যেখানে অ্যাক্টুয়া () হ'ল আসল ডেমন (এটি খুব লগ করতে লিখেছে)। নোট করুন যে আমার কাছে একটি সেটিংস ফাইলে একটি DEBUG ভেরিয়েবল রয়েছে, এটি সত্য হয়ে গেলে, আমি ডিমনটি কাঁটাচামচ করি না যাতে এটি কনসোলে কার্যকর হয়।
ডেমন
ডেমনগুলি উইন্ডোজ পরিষেবার সমতুল্য ইউনিক্স। এগুলি এমন প্রক্রিয়া যা অন্যান্য প্রক্রিয়া থেকে পৃথক হয়ে পটভূমিতে চলে। এর অর্থ হ'ল তাদের বাবা সাধারণত দীক্ষা করেন এবং তারা কোনও টিটিআই থেকে বিচ্ছিন্ন থাকে। তারা স্বাধীন হওয়ায় তাদের আউটপুট দেওয়ার কোনও পূর্বনির্ধারিত স্থান নেই।
ডেমন তৈরির জন্য প্রচুর পাইথন লাইব্রেরি এবং স্নিপেট রয়েছে, উপরের উদাহরণে আমি আমার নিজের ফাংশনটি ব্যবহার করি যা স্টেইনার নটসেন্স এবং জেফ কুনেস সংস্করণ থেকে কিছু ধারণাগুলি একত্রিত করে। এটি যতটা সম্ভব সহজ, নোট করুন যে আমি দুবার কাঁটাচামচ করি ।
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()