python বাংলায় - কিভাবে আপনি পাইথন একটি ডেমন তৈরি করবেন?




প্রয়োজনীয়তা এর (13)

গুগলের সন্ধানে x2 কোড স্নিপেট প্রকাশ করে। প্রথম ফলাফলটি হল এই কোড রেসিপি যা অনেকগুলি ডকুমেন্টেশন এবং ব্যাখ্যা রয়েছে, এর সাথে নীচে কিছু দরকারী আলোচনার পাশাপাশি রয়েছে।

তবে, আরেকটি কোড নমুনা , যেখানে এত বেশি ডকুমেন্টেশন নেই, এতে কমান্ডগুলি যেমন স্টার্ট, স্টপ এবং রিস্টার্ট করার জন্য নমুনা কোড রয়েছে। এটি একটি পিআইডি ফাইল তৈরি করে যা ডেমন ইতিমধ্যে চলমান ইত্যাদি চেক করার জন্য সহজ হতে পারে।

এই নমুনাগুলি কীভাবে ডেমন তৈরি করবেন তা ব্যাখ্যা করে। বিবেচনা করা প্রয়োজন যে কোন অতিরিক্ত জিনিস আছে? একটি নমুনা অন্য তুলনায় ভাল, এবং কেন?


Answers

সম্ভবত প্রশ্নটির সরাসরি উত্তর নেই, তবে systemd একটি ডেমন হিসাবে আপনার অ্যাপ্লিকেশন চালানোর জন্য ব্যবহার করা যেতে পারে। এখানে একটি উদাহরণ:

[Unit]
Description=Python daemon
After=syslog.target
After=network.target

[Service]
Type=simple
User=<run as user>
Group=<run as group group>
ExecStart=/usr/bin/python <python script home>/script.py

# Give the script some time to startup
TimeoutSec=300

[Install]
WantedBy=multi-user.target

আমি এই পদ্ধতিটি পছন্দ করি কারণ আপনার জন্য অনেক কাজ করা হয়েছে এবং তারপরে আপনার ডেমন স্ক্রিপ্টটি আপনার বাকি সিস্টেমের অনুরূপ আচরণ করে।

-অথবা দ্বারা


যেহেতু পাইথন-ডেমন এখনো পাইথন 3.x সমর্থন করে নি, এবং মেইলিং লিস্টে যা পড়তে পারে তা থেকে এটি কখনও হতে পারে না, আমি পিইপি 3143 এর নতুন বাস্তবায়ন লিখেছি: pep3143daemon

pep3143daemon কমপক্ষে Python 2.6, 2.7 এবং 3.x সমর্থন করা উচিত

এটি একটি PidFile ক্লাস রয়েছে।

লাইব্রেরি শুধুমাত্র স্ট্যান্ডার্ড লাইব্রেরি এবং ছয় মডিউল উপর নির্ভর করে।

এটি পাইথন-ডেমনের প্রতিস্থাপনে ড্রপ হিসাবে ব্যবহার করা যেতে পারে।

এখানে documentation


একটি বিকল্প - একটি স্বাভাবিক, অ-ডিমনোডাইজড পাইথন প্রোগ্রাম তৈরি করুন এবং তারপরে supervisord.org ব্যবহার করে এটি ডিমনোমাইজ করুন। এটি অনেক মাথাব্যাথা সংরক্ষণ করতে পারে, এবং * nix- এবং ভাষা-পোর্টেবল।


পাইথন দিয়ে ডেমন তৈরি করার সবচেয়ে সহজ উপায় হল Twisted ইভেন্ট-চালিত কাঠামোটি ব্যবহার করা। এটি আপনার জন্য deemonization জন্য প্রয়োজনীয় সব উপাদান পরিচালনা করে। এটি সমবায় অনুরোধ হ্যান্ডেল করতে রিঅ্যাকটর প্যাটার্ন ব্যবহার করে।


এই ফাংশনটি একটি অ্যাপ্লিকেশনকে একটি ডেমনে রূপান্তর করবে:

import sys
import os

def daemonize():
    try:
        pid = os.fork()
        if pid > 0:
            # exit first parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #1 failed: {0}\n'.format(err))
        sys.exit(1)
    # decouple from parent environment
    os.chdir('/')
    os.setsid()
    os.umask(0)
    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #2 failed: {0}\n'.format(err))
        sys.exit(1)
    # redirect standard file descriptors
    sys.stdout.flush()
    sys.stderr.flush()
    si = open(os.devnull, 'r')
    so = open(os.devnull, 'w')
    se = open(os.devnull, 'w')
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

কয়েক বছর পরে এবং অনেক প্রচেষ্টা, এখন আমি বুঝতে পারছি যে পাইথন থেকে সরাসরি শুরু, স্টপ, একটি ডেমো পুনরায় চালু করতে চেয়ে চেয়ে আরও ভাল উপায় রয়েছে: পরিবর্তে ওএস সরঞ্জামগুলি ব্যবহার করুন!

সংক্ষেপে, python myapp start এবং python myapp stop , আমি এই অ্যাপ্লিকেশনটি শুরু করার জন্য এটি করি:

screen -S myapp python myapp.py    
CTRL+A, D to detach

অথবা screen -dmS myapp python myapp.py এটি একটি কমান্ডে শুরু এবং আলাদা করতে

তারপর:

screen -r myapp

আবার এই টার্মিনাল সংযুক্ত। একবার টার্মিনালে, এটি বন্ধ করতে CTRL + C ব্যবহার করা সম্ভব।


YapDi একটি অপেক্ষাকৃত নতুন পাইথন মডিউল যা হ্যাকার নিউজ-এ পপ আপ হয়েছে। খুব দরকারী দেখায়, স্ক্রিপ্টের ভিতরে একটি পাইথন স্ক্রিপ্ট ডিমন মোডে রূপান্তর করতে ব্যবহার করা যেতে পারে।


স্যান্ডার মারেচলের কোড নমুনায় কয়েকটি লাইন সংশোধন করা হয়েছে ( গ্রহণযোগ্য উত্তরে @ জেফবউয়ারের দ্বারা উল্লেখ করা হয়েছে) একটি ডেমো বন্ধ করার আগে একটি quit() পদ্ধতিটি কার্যকর করার জন্য। এই কখনও কখনও খুব দরকারী।

এটা এখানে.

দ্রষ্টব্য: আমি "পাইথন-ডেমন" মডিউলটি ব্যবহার করি না কারণ ডকুমেন্টেশন এখনও অনুপস্থিত রয়েছে (আরও অনেকগুলি SO প্রশ্ন দেখুন) এবং এটি অস্পষ্ট (কিভাবে এই মডিউলের সাথে কমান্ড লাইন থেকে সঠিকভাবে একটি ডেমন শুরু / বন্ধ করবেন?)


pypi.python.org/pypi/python-daemon প্যাকেজটি নোট করুন যা বাক্সের বাইরে ডেমোনের পিছনে অনেক সমস্যা সমাধান করে।

এটি অন্যান্য বৈশিষ্ট্যগুলির মধ্যে (ডেবিয়ান প্যাকেজ বর্ণনা থেকে) সক্ষম করে:

  • নিজস্ব প্রক্রিয়া গ্রুপ মধ্যে প্রক্রিয়া বিচ্ছিন্ন করুন।
  • একটি chroot ভিতরে চলমান জন্য উপযুক্ত প্রক্রিয়া সেট পরিবেশ।
  • Suid এবং sgid সুযোগ প্রত্যাহার।
  • সব খোলা ফাইল বর্ণনাকারী বন্ধ করুন।
  • ওয়ার্ক ডিরেক্টরি, ইউআইডি, গিড এবং উমস্ক পরিবর্তন করুন।
  • উপযুক্ত সংকেত হ্যান্ডলার সেট করুন।
  • Stdin, stdout, এবং stderr এর জন্য নতুন ফাইল বর্ণনাকারী খুলুন।
  • একটি নির্দিষ্ট পিআইডি লক ফাইল পরিচালনা করুন।
  • এন্ট-প্রিজম প্রক্রিয়াকরণের জন্য ক্লিনআপ ফাংশন নিবন্ধন করুন।

একটি ভাল আচরণ করা ডেমন প্রক্রিয়া হয়ে উঠার যত্ন নেওয়ার জন্য অনেকগুলি নিষ্ঠুর জিনিস রয়েছে :

  • কোর ডাম্পগুলি প্রতিরোধ করুন (অনেক ডিমনগুলি রুট হিসাবে চালানো হয় এবং কোর ডাম্প সংবেদনশীল তথ্য ধারণ করতে পারে)

  • একটি chroot gaol ভিতরে সঠিকভাবে আচরণ

  • ইউআইডি, জিআইডি, ওয়ার্কিং ডিরেক্টরি, umask, এবং অন্যান্য ক্ষেত্রে ব্যবহারযোগ্য প্যারামিটারের ক্ষেত্রে উপযুক্ত ক্ষেত্রে সেট করুন

  • elevated suid , sgid বিশেষাধিকার পরিত্যাগ

  • ব্যবহারের ক্ষেত্রে নির্ভর করে বর্জন সঙ্গে সমস্ত খোলা ফাইল বর্ণনাকারী বন্ধ করুন

  • inetd , inetd , ইত্যাদি যেমন ইতিমধ্যে বিচ্ছিন্ন প্রেক্ষাপটে ভেতরে শুরু হলে সঠিকভাবে আচরণ করুন।

  • বুদ্ধিমান ডেমন আচরণের জন্য সিগন্যাল হ্যান্ডলার সেট আপ করুন, তবে ব্যবহারের ক্ষেত্রে নির্ধারিত নির্দিষ্ট হ্যান্ডলারগুলির সাথেও

  • ডিমন প্রক্রিয়া থেকে stdin , stdout , stderr মান স্ট্রীমগুলি পুনঃনির্দেশ করুন আর আর একটি নিয়ন্ত্রণকারী টার্মিনাল নেই

  • একটি পিআইআইডি ফাইলকে একটি সমবায় উপদেষ্টা লক হিসাবে পরিচালনা করুন, এটি সম্পূর্ণরূপে অনেকগুলি বৈষম্যমূলক কিন্তু আচরণের বৈধ উপায়গুলির সাথে নিজের মধ্যে কীট

  • প্রক্রিয়া সমাপ্ত করা হয় যখন সঠিক পরিষ্কার করার অনুমতি দেয়

  • আসলে zombies নেতৃস্থানীয় ছাড়া একটি ডেমন প্রক্রিয়া হয়ে

ক্যানোনিকাল ইউনিক্স সাহিত্য ( ইউনিক্স এনভায়রনমেন্টের উন্নত প্রোগ্রামিং , দেরী ড। রিচার্ড স্টিভেনস, অ্যাডিসন-ওয়েসলি, 1 99 2) দ্বারা বর্ণিত এইগুলির মধ্যে কয়েকটি মানক । স্ট্রিম রিডাইরেকশন এবং পিআইডি ফাইল হ্যান্ডলিংয়ের মতো অন্যান্যগুলি হল প্রচলিত আচরণ যা বেশিরভাগ ডেমন ব্যবহারকারীরা আশা করবে তবে এটি কম মানসম্পন্ন।

এই সব PEP 3143 "স্ট্যান্ডার্ড ডেমন প্রক্রিয়া লাইব্রেরি" স্পেসিফিকেশন দ্বারা আচ্ছাদিত করা হয়। pypi.python.org/pypi/python-daemon রেফারেন্স বাস্তবায়ন পাইথন 2.7 বা তার পরে, এবং পাইথন 3.2 বা তার পরে কাজ করে।


80% সময়, যখন লোকেরা "ডেমন" বলে, তারা কেবল একটি সার্ভার চান। যেহেতু প্রশ্নটি এই বিন্দুতে পুরোপুরি অস্পষ্ট, তাই বলা যায় যে উত্তরগুলির সম্ভাব্য ডোমেন কী হতে পারে। যেহেতু একটি সার্ভার পর্যাপ্ত, সেখানে শুরু। একটি প্রকৃত "ডেমন" আসলে যদি প্রয়োজন হয় (এটি বিরল), সার্ভারকে ডিমনোমাইজ করার উপায় হিসাবে নহুপে পড়ুন।

যতক্ষণ না প্রকৃত ডিমন হিসাবে প্রকৃতপক্ষে প্রয়োজন হয়, কেবল একটি সহজ সার্ভার লিখুন।

এছাড়াও WSGI রেফারেন্স বাস্তবায়ন তাকান।

এছাড়াও সহজ HTTP সার্ভার তাকান

"কোন অতিরিক্ত জিনিস বিবেচনা করা প্রয়োজন?" হ্যাঁ। প্রায় এক মিলিয়ন জিনিস। কি প্রোটোকল? কত অনুরোধ? কতক্ষণ প্রতিটি অনুরোধ সেবা করতে? তারা কত ঘন ঘন পৌঁছবে? আপনি একটি ডেডিকেটেড প্রক্রিয়া ব্যবহার করবেন? টপিক? Subprocesses? একটি ডেমন লেখা একটি বড় কাজ।


@ ডাস্টিনের দ্বারা উল্লেখ করা ডেমন মডিউলটি আমার জন্য কাজ করে না আমি ভীত। পরিবর্তে আমি pypi.python.org/pypi/python-daemon ইনস্টল করেছি এবং নিম্নলিখিত কোডটি ব্যবহার করেছি:

# filename myDaemon.py
import sys
import daemon
sys.path.append('/home/ubuntu/samplemodule') # till __init__.py
from samplemodule import moduleclass 

with daemon.DaemonContext():
    moduleclass.do_running() # I have do_running() function and whatever I was doing in __main__() in module.py I copied in it.

চলমান সহজ

> python myDaemon.py

শুধু সম্পূর্ণতা জন্য এখানে samplemodule ডিরেক্টরি কন্টেন্ট

>ls samplemodule
__init__.py __init__.pyc moduleclass.py

Moduleclass.py কন্টেন্ট হতে পারে

class moduleclass():
    ...

def do_running():
    m = moduleclass()
    # do whatever daemon is required to do.

আমি সবসময় এই কাজ,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

এটা সহজ, কিন্তু খুব দরকারী।





python daemon