কীভাবে পাইথন স্ক্রিপ্টটি লিনাক্সে কোনও পরিষেবা বা ডেমনের মতো চালানো যায়


175

আমি একটি পাইথন স্ক্রিপ্ট লিখেছি যা একটি নির্দিষ্ট ই-মেইল ঠিকানা চেক করে এবং কোনও বহিরাগত প্রোগ্রামে নতুন ইমেলগুলি প্রেরণ করে। এই স্ক্রিপ্টটি 24/7 কার্যকর করার জন্য কীভাবে পাব, যেমন এটি ডিমন বা লিনাক্সের পরিষেবাতে পরিণত করা। আমারও কি এমন লুপের প্রয়োজন হবে যা প্রোগ্রামে কখনই শেষ হয় না, বা কেবল কোডটি পুনরায় একাধিকবার প্রয়োগ করেই করা যেতে পারে?


1
তাই প্রশ্ন দেখুন: stackoverflow.com/questions/1423345/...
mjv

3
"একটি নির্দিষ্ট ই-মেইল ঠিকানা পরীক্ষা করে এবং একটি বহিরাগত প্রোগ্রামে নতুন ই-মেইল পাস করে" সেন্ডমেইল কি তাই করে না? আপনি কোনও স্ক্রিপ্টে একটি মেলবক্স রুট করতে মেল ওরফে সংজ্ঞা দিতে পারেন। আপনি এটি করতে মেইল ​​এলিয়াস ব্যবহার করছেন না কেন?
এস। লট

2
একটি আধুনিক লিনাক্স যা systemdআপনি এখানেdaemon বর্ণিত হিসাবে মোডে একটি সিস্টেমড পরিষেবা তৈরি করতে পারেন । আরও দেখুন: freedesktop.org/software/systemd/man/systemd.service.html
সিসিপিজা

যদি লিনাক্স সিস্টেম সিস্টেমেড সমর্থন করে তবে এখানে বর্ণিত পদ্ধতির ব্যবহার করুন
gerardw

উত্তর:


96

আপনার এখানে দুটি বিকল্প রয়েছে।

  1. আপনার স্ক্রিপ্ট কল করে এমন একটি সঠিক ক্রোন জব করুন । ক্রোন একটি জিএনইউ / লিনাক্স ডেমনের একটি সাধারণ নাম যা আপনার সেট করার সময়সূচী অনুসারে পর্যায়ক্রমে স্ক্রিপ্টগুলি চালু করে। আপনি নিজের স্ক্রিপ্টটি কোনও ক্রন্টবায় যুক্ত করুন বা একটি বিশেষ ডিরেক্টরিতে এটিতে একটি সিমিলিংক রাখুন এবং ডিমন এটি ব্যাকগ্রাউন্ডে চালু করার কাজ পরিচালনা করে। উইকিপিডিয়ায় আপনি আরও পড়তে পারেন । বিভিন্ন ধরণের ক্রোন ডিমন রয়েছে তবে আপনার জিএনইউ / লিনাক্স সিস্টেমটি এটি ইতিমধ্যে ইনস্টল করা উচিত।

  2. আপনার স্ক্রিপ্ট নিজেই ডিমনাইজ করতে সক্ষম হওয়ার জন্য এক ধরণের পাইথন পদ্ধতির (যেমন একটি গ্রন্থাগার) ব্যবহার করুন। হ্যাঁ, এটির জন্য একটি সাধারণ ইভেন্ট লুপের প্রয়োজন হবে (যেখানে আপনার ইভেন্টগুলি টাইমার ট্রিগার হয়, সম্ভবত ঘুমের ফাংশন দ্বারা সরবরাহিত হয়)।

আমি আপনাকে 2 বেছে নেওয়ার পরামর্শ দিচ্ছি না, কারণ আপনি আসলে ক্রোন কার্যকারিতা পুনরাবৃত্তি করবেন। লিনাক্স সিস্টেমের দৃষ্টান্তটি হ'ল একাধিক সহজ সরঞ্জামগুলিকে আপনার সমস্যার সমাধান করতে এবং সমাধান করতে দেওয়া। আপনার ডেমোন তৈরি করার অতিরিক্ত কারণগুলি না থাকলে (পর্যায়ক্রমে ট্রিগার ছাড়াও) অন্য পদ্ধতিটি বেছে নিন।

এছাড়াও, আপনি যদি লুপের সাথে ডেমোনাইজ ব্যবহার করেন এবং ক্রাশ ঘটে, তবে কেউ তার পরে মেলটি পরীক্ষা করবে না (যেমন এই মন্তব্যে ইভান নেভোস্ট্রুয়েভ নির্দেশ করেছেন )। স্ক্রিপ্টটি ক্রোন জব হিসাবে যুক্ত করা হলেও, এটি কেবল আবার ট্রিগার করবে।


7
ক্রোনজবকে +1 করুন। আমি মনে করি না যে প্রশ্নটি নির্দিষ্ট করে দিয়েছে যে এটি একটি স্থানীয় মেল অ্যাকাউন্ট চেক করছে, তাই মেল ফিল্টারগুলি প্রয়োগ হয় না
জন লা রুই

পাইথন প্রোগ্রামে টার্মিনেশন ছাড়াই একটি লুপ ব্যবহার করে এবং তারপরে তালিকাতে এটি নিবন্ধভুক্ত crontabহবে কী হবে? আমি যদি .pyপ্রতি ঘন্টার জন্য এমন সেট আপ করি তবে এটি কী এমন অনেকগুলি প্রক্রিয়া তৈরি করবে যা কখনই শেষ হবে না? যদি তা হয় তবে আমি মনে করি এটি বেশ ডিমন পছন্দ করবে।
ভেক হিসিয়াও

আমি দেখতে পাচ্ছি যে আপনি যদি প্রতি মিনিটে একবার ইমেলের জন্য চেক পরীক্ষা করেন (যা ক্রোনটির জন্য সর্বনিম্ন সময় রেজোলিউশন) ron তবে আমি যদি প্রতি 10 সেকেন্ডে ইমেলগুলি পরীক্ষা করতে চাই? আমার কিউরিটি 60 বার চালানোর জন্য পাইথন স্ক্রিপ্টটি লেখা উচিত, যার অর্থ এটি 50 সেকেন্ড পরে শেষ হয়, এবং তারপরে ক্রোনটি 10 ​​সেকেন্ড পরে আবার স্ক্রিপ্টটি শুরু করা যাক?
ম্যাডস স্কজার্ন

আমি ডেমন / পরিষেবাদি নিয়ে কাজ করি নি, তবে আমি এই ধারণার মধ্যে ছিলাম যে এটি (OS / init / init.d / upstart বা এটি যা বলা হয়) / যখন এটি শেষ / ক্র্যাশ হয়ে যায় তখন একটি ডেমন পুনরায় চালু করার যত্ন নেয়।
ম্যাডস স্কজার্ন

@ ভেকহিসিয়াও হ্যাঁ, ক্রন্টব স্ক্রিপ্টকে কল করে আপনার পাইথন স্ক্রিপ্টের অনেকগুলি উদাহরণ সকলের সাথে বলা হবে তার লুপ ....
পাইপো

71

এখানে একটা চমৎকার বর্গ যে থেকে নেওয়া হয় এখানে :

#!/usr/bin/env python

import sys, os, time, atexit
from signal import SIGTERM

class Daemon:
        """
        A generic daemon class.

        Usage: subclass the Daemon class and override the run() method
        """
        def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
                self.stdin = stdin
                self.stdout = stdout
                self.stderr = stderr
                self.pidfile = pidfile

        def daemonize(self):
                """
                do the UNIX double-fork magic, see Stevens' "Advanced
                Programming in the UNIX Environment" for details (ISBN 0201563177)
                http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
                """
                try:
                        pid = os.fork()
                        if pid > 0:
                                # exit first parent
                                sys.exit(0)
                except OSError, e:
                        sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
                        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, e:
                        sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
                        sys.exit(1)

                # redirect standard file descriptors
                sys.stdout.flush()
                sys.stderr.flush()
                si = file(self.stdin, 'r')
                so = file(self.stdout, 'a+')
                se = file(self.stderr, 'a+', 0)
                os.dup2(si.fileno(), sys.stdin.fileno())
                os.dup2(so.fileno(), sys.stdout.fileno())
                os.dup2(se.fileno(), sys.stderr.fileno())

                # write pidfile
                atexit.register(self.delpid)
                pid = str(os.getpid())
                file(self.pidfile,'w+').write("%s\n" % pid)

        def delpid(self):
                os.remove(self.pidfile)

        def start(self):
                """
                Start the daemon
                """
                # Check for a pidfile to see if the daemon already runs
                try:
                        pf = file(self.pidfile,'r')
                        pid = int(pf.read().strip())
                        pf.close()
                except IOError:
                        pid = None

                if pid:
                        message = "pidfile %s already exist. Daemon already running?\n"
                        sys.stderr.write(message % self.pidfile)
                        sys.exit(1)

                # Start the daemon
                self.daemonize()
                self.run()

        def stop(self):
                """
                Stop the daemon
                """
                # Get the pid from the pidfile
                try:
                        pf = file(self.pidfile,'r')
                        pid = int(pf.read().strip())
                        pf.close()
                except IOError:
                        pid = None

                if not pid:
                        message = "pidfile %s does not exist. Daemon not running?\n"
                        sys.stderr.write(message % self.pidfile)
                        return # not an error in a restart

                # Try killing the daemon process       
                try:
                        while 1:
                                os.kill(pid, SIGTERM)
                                time.sleep(0.1)
                except OSError, err:
                        err = str(err)
                        if err.find("No such process") > 0:
                                if os.path.exists(self.pidfile):
                                        os.remove(self.pidfile)
                        else:
                                print str(err)
                                sys.exit(1)

        def restart(self):
                """
                Restart the daemon
                """
                self.stop()
                self.start()

        def run(self):
                """
                You should override this method when you subclass Daemon. It will be called after the process has been
                daemonized by start() or restart().
                """

1
সিস্টেমটি পুনরায় চালু হওয়ার সাথে সাথে কি এটি পুনরায় চালু হবে? কারণ যখন সিস্টেমটি পুনরায় চালু হবে তখন প্রক্রিয়াটি ঠিক মারা যাবে?
শিবপ্রসাদ

58

আপনার পাইথন-ডেমন লাইব্রেরি ব্যবহার করা উচিত , এটি সবকিছুর যত্ন নেয়।

পিপিআই থেকে: লাইব্রেরিটি একটি ভাল আচরণযুক্ত ইউনিক্স ডেমন প্রক্রিয়াটি প্রয়োগ করতে।


3
ডিট্টো জর্জে ভার্গাসের মন্তব্য। কোডটি দেখার পরে, এটি দেখতে বেশ কয়েকটি দুর্দান্ত কোডের মতো দেখা যাচ্ছে, তবে ডকস এবং উদাহরণগুলির সম্পূর্ণ অভাব এটি ব্যবহার করা খুব কঠিন করে তোলে, যার অর্থ বেশিরভাগ বিকাশকারী আরও ভাল নথিভুক্ত বিকল্পের জন্য এটিকে যথাযথভাবে উপেক্ষা করবেন।
সেরিন

1
পাইথন 3.5 তে সঠিকভাবে কাজ না করা বলে মনে হচ্ছে: gist.github.com/MartinThoma/fa4deb2b4c71ffcd726b24b7ab581ae2
মার্টিন থোমা

আশানুরূপ কাজ করছে না। যদিও এটি করা ভাল হবে।
হারলিন

ইউনিক্স! = লিনাক্স - এই সমস্যা হতে পারে?
ডানা

39

আপনি আপনার স্ক্রিপ্টটি টিটি থেকে আলাদা করতে কাঁটাচামড়া () ব্যবহার করতে পারেন এবং এটি চালিয়ে যেতে চালিয়ে যেতে পারেন, যেমন:

import os, sys
fpid = os.fork()
if fpid!=0:
  # Running as daemon now. PID is fpid
  sys.exit(0)

অবশ্যই আপনারও একটি অন্তহীন লুপটি কার্যকর করতে হবে, যেমন

while 1:
  do_your_check()
  sleep(5)

আশা করি এটি আপনি শুরু করেছেন।


হ্যালো, আমি এটি চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করে। কিন্তু যখন আমি টার্মিনালটি বন্ধ করি বা ssh অধিবেশন থেকে বেরিয়ে আসি, স্ক্রিপ্টটিও কাজ বন্ধ করে দেয় !!
ডেভিড Okwii

@ ডেভিডকুই nohup/ disownকমান্ডগুলি কনসোল থেকে প্রক্রিয়াটি আলাদা করবে এবং এটি মারা যাবে না। বা আপনি এটি init.d দিয়ে শুরু করতে পারেন
ফোলাট

14

আপনি পাইথন স্ক্রিপ্টটি শেল স্ক্রিপ্ট ব্যবহার করে পরিষেবা হিসাবে চালাতে পারেন। প্রথমে পাইথন স্ক্রিপ্টটি চালানোর জন্য একটি শেল স্ক্রিপ্ট তৈরি করুন (স্ক্রিপ্টের নাম সালিসি নাম)

#!/bin/sh
script='/home/.. full path to script'
/usr/bin/python $script &

এখন /etc/init.d/scriptname এ একটি ফাইল তৈরি করুন

#! /bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/home/.. path to shell script scriptname created to run python script
PIDFILE=/var/run/scriptname.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

case "$1" in
  start)
     log_daemon_msg "Starting feedparser"
     start_daemon -p $PIDFILE $DAEMON
     log_end_msg $?
   ;;
  stop)
     log_daemon_msg "Stopping feedparser"
     killproc -p $PIDFILE $DAEMON
     PID=`ps x |grep feed | head -1 | awk '{print $1}'`
     kill -9 $PID       
     log_end_msg $?
   ;;
  force-reload|restart)
     $0 stop
     $0 start
   ;;
  status)
     status_of_proc -p $PIDFILE $DAEMON atd && exit 0 || exit $?
   ;;
 *)
   echo "Usage: /etc/init.d/atd {start|stop|restart|force-reload|status}"
   exit 1
  ;;
esac

exit 0

এখন আপনি /etc/init.d/scriptname স্টার্ট বা স্টপ কমান্ডটি ব্যবহার করে আপনার অজগর স্ক্রিপ্টটি শুরু এবং বন্ধ করতে পারেন।


আমি এটি চেষ্টা করেছি, এবং দেখা যাচ্ছে এটি প্রক্রিয়াটি শুরু করবে তবে এটি ডিমনাইজ হবে না (যেমন এটি এখনও টার্মিনালের সাথে সংযুক্ত)। আপনি আপডেট-আরসি.ডি চালিয়ে এটি বুটে চালিয়ে দিলে সম্ভবত এটি দুর্দান্ত কাজ করবে (আমি ধরে নিই যে এই স্ক্রিপ্টগুলি চালিত হওয়ার সাথে সাথে কোনও টার্মিনাল সংযুক্ত নেই) তবে আপনি নিজে নিজে এটির আবেদন করলে এটি কার্যকর হয় না doesn't সুপারভাইজারের মতো মনে হয় এটি আরও ভাল সমাধান হতে পারে।
ryuusenshi

13

একটি সহজ এবং সমর্থিত সংস্করণ হয় Daemonize

পাইথন প্যাকেজ সূচক (পাইপিআই) থেকে এটি ইনস্টল করুন:

$ pip install daemonize

এবং তারপরে ব্যবহার করুন:

...
import os, sys
from daemonize import Daemonize
...
def main()
      # your code here

if __name__ == '__main__':
        myname=os.path.basename(sys.argv[0])
        pidfile='/tmp/%s' % myname       # any name
        daemon = Daemonize(app=myname,pid=pidfile, action=main)
        daemon.start()

1
সিস্টেমটি পুনরায় চালু হওয়ার সাথে সাথে কি এটি পুনরায় চালু হবে? কারণ যখন সিস্টেমটি পুনরায় চালু হবে তখন প্রক্রিয়াটি ঠিক মারা যাবে?
শিবপ্রসাদ

@ শিভাপ্রসাদ আপনি কি এর উত্তর খুঁজে পেয়েছেন?
1UC1F3R616

সিস্টেম পুনরায় চালু হওয়ার পরে পুনরায় চালু করা কোনও রাক্ষস ফাংশন নয়। প্রারম্ভকালে আপনার অ্যাপ্লিকেশনটি চালানোর জন্য ক্রোন, সিস্টেমট্যাক্ট, স্টার্টআপ হুক বা অন্যান্য সরঞ্জাম ব্যবহার করুন।
এফসিএম

1
@ কুশ হ্যাঁ আমি সিস্টেম পুনরায় চালু হওয়ার পরে বা সিস্টেমেড ফাংশনগুলির মতো কমান্ড ব্যবহার করার মতো পুনরায় চালু করতে চেয়েছিলাম, যদি এই অ্যাক্সেসটি
docamentation/

@ শিভাপ্রসাদ ধন্যবাদ ভাই
1UC1F3R616

12

cronস্পষ্টতই বিভিন্ন উদ্দেশ্যে একটি দুর্দান্ত পছন্দ। তবে আপনি ওপিতে অনুরোধ হিসাবে এটি কোনও পরিষেবা বা ডেমন তৈরি করে না। cronকেবল সময়ে সময়ে কাজ চালায় (অর্থ কাজ শুরু হয়ে যায় এবং থামবে), এবং একবারে / মিনিটের বেশি বেশি নয়। এর সাথে সমস্যাগুলি রয়েছে cron- উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টের কোনও পূর্ববর্তী উদাহরণটি পরবর্তী cronসময়সূচীটি আসে এবং একটি নতুন উদাহরণ চালু করে তবে এটি ঠিক আছে কি? cronনির্ভরতা পরিচালনা করে না; সময়সূচী যখন বলে তখন এটি একটি কাজ শুরু করার চেষ্টা করে।

আপনি যদি এমন কোনও পরিস্থিতি খুঁজে পান যেখানে আপনার সত্যিকার অর্থে ডিমন প্রয়োজন (এমন প্রক্রিয়া যা কখনই বন্ধ হয় না), একবার দেখুন supervisord। এটি একটি সাধারণ, অ-ডিমোনাইজড স্ক্রিপ্ট বা প্রোগ্রাম মোড়ানো এবং ডেমনের মতো চালিত করার সহজ উপায় সরবরাহ করে। নেটিভ পাইথন ডেমন তৈরির চেয়ে এটি অনেক ভাল উপায়।


9

$nohupলিনাক্সে কমান্ড ব্যবহার সম্পর্কে কীভাবে ?

আমি আমার ব্লুহোস্ট সার্ভারে আমার কমান্ডগুলি চালনার জন্য এটি ব্যবহার করি।

আমি ভুল হলে দয়া করে পরামর্শ করুন।


আমি এটি ব্যবহার করি, কবজির মতো কাজ করে। "আমি ভুল হলে দয়া করে পরামর্শ দিন।"
আলেকজান্দ্রে মজেল 22

5

আপনি যদি টার্মিনাল (ssh বা কিছু) ব্যবহার করছেন এবং আপনি টার্মিনাল থেকে লগ আউট করার পরে দীর্ঘ সময়ের স্ক্রিপ্টটি কাজ করতে চান, আপনি এটি চেষ্টা করতে পারেন:

screen

apt-get install screen

ভিতরে একটি ভার্চুয়াল টার্মিনাল তৈরি করুন (যথা abc): screen -dmS abc

এখন আমরা এবিসিতে সংযুক্ত: screen -r abc

সুতরাং, এখন আমরা পাইথন স্ক্রিপ্ট চালাতে পারি: python keep_sending_mails.py

এখন থেকে, আপনি সরাসরি আপনার টার্মিনালটি বন্ধ করতে পারেন, তবে পাইথন স্ক্রিপ্টটি বন্ধ হওয়ার পরিবর্তে চলতে থাকবে

যেহেতু keep_sending_mails.pyএটির পিআইডি হ'ল টার্মিনাল (এসএসএস) না করে ভার্চুয়াল স্ক্রিনের একটি শিশু প্রক্রিয়া

আপনি যদি ফিরে যেতে চান তবে আপনার স্ক্রিপ্টের চলমান স্থিতি পরীক্ষা করুন, আপনি screen -r abcআবার ব্যবহার করতে পারেন


2
এটি কাজ করার সময় এটি খুব দ্রুত এবং নোংরা এবং উত্পাদন এড়ানো উচিত
pcnate

3

প্রথমে মেইল ​​এলিয়াস পড়ুন। কোনও মেল ওরফে মেল সিস্টেমের অভ্যন্তরে এটি আপনাকে ডেমোনস বা পরিষেবাগুলি বা বাছাইয়ের কিছু দিয়ে বোকা না করেই করবে।

আপনি একটি সাধারণ স্ক্রিপ্ট লিখতে পারেন যা প্রতিবার কোনও নির্দিষ্ট মেলবক্সে কোনও মেল বার্তা প্রেরণের পরে সেন্ডমেল দ্বারা কার্যকর করা হবে।

Http://www.feep.net/sendmail/tutorial/intro/aliases.html দেখুন

আপনি যদি সত্যিই অযথা জটিল সার্ভারটি লিখতে চান তবে আপনি এটি করতে পারেন।

nohup python myscript.py &

এটি সবই নেয়। আপনার স্ক্রিপ্টটি কেবল লুপ করে ঘুমায়।

import time
def do_the_work():
    # one round of polling -- checking email, whatever.
while True:
    time.sleep( 600 ) # 10 min.
    try:
        do_the_work()
    except:
        pass

6
এখানে সমস্যাটি হ'ল do_the_work()স্ক্রিপ্টটি ক্র্যাশ করতে পারে এবং এটিকে আবার
দুপুরে

যদি ফাংশন do_the_work () ক্র্যাশ হয়, তবে এটি 10 ​​মিনিটের পরে আবার কল করা হবে, যেহেতু কেবলমাত্র একটি ফাংশন কল ত্রুটি উত্থাপন করে। তবে লুপটি ক্র্যাশ না করে কেবল tryঅংশ ব্যর্থ হয়ে যায় এবং তার except:পরিবর্তে অংশটি কল করা হবে (এই ক্ষেত্রে কিছুই নয়) তবে লুপটি চালিয়ে যাবে এবং ফাংশনটি কল করার চেষ্টা চালিয়ে যাবে।
সরবট

3

ধরে নিচ্ছি যে আপনি সত্যিই আপনার লুপটি পটভূমি পরিষেবা হিসাবে 24/7 চালানোর জন্য চান

এমন একটি সমাধানের জন্য যা আপনার কোডটি লাইব্রেরিতে ইনজেকশন জড়িত না, আপনি লিনাক্স ব্যবহার করার কারণে আপনি কেবল একটি পরিষেবা টেম্পলেট তৈরি করতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

আপনার ফাইলটি ডিমন পরিষেবা ফোল্ডারে (সাধারণত /etc/systemd/system/) রাখুন এবং নিম্নলিখিত সিস্টেমেটেল কমান্ড ব্যবহার করে এটি ইনস্টল করুন (সম্ভবত সুডোর সুবিধাগুলির প্রয়োজন হবে):

systemctl enable <service file name without extension>

systemctl daemon-reload

systemctl start <service file name without extension>

তারপরে আপনি কমান্ডটি ব্যবহার করে আপনার পরিষেবাটি চলছে কিনা তা পরীক্ষা করতে পারেন:

systemctl | grep running

2

আমি এই সমাধানটি সুপারিশ করব। আপনার উত্তরাধিকার সূত্রে ও পদ্ধতিটিকে ওভাররাইড করতে হবে run

import sys
import os
from signal import SIGTERM
from abc import ABCMeta, abstractmethod



class Daemon(object):
    __metaclass__ = ABCMeta


    def __init__(self, pidfile):
        self._pidfile = pidfile


    @abstractmethod
    def run(self):
        pass


    def _daemonize(self):
        # decouple threads
        pid = os.fork()

        # stop first thread
        if pid > 0:
            sys.exit(0)

        # write pid into a pidfile
        with open(self._pidfile, 'w') as f:
            print >> f, os.getpid()


    def start(self):
        # if daemon is started throw an error
        if os.path.exists(self._pidfile):
            raise Exception("Daemon is already started")

        # create and switch to daemon thread
        self._daemonize()

        # run the body of the daemon
        self.run()


    def stop(self):
        # check the pidfile existing
        if os.path.exists(self._pidfile):
            # read pid from the file
            with open(self._pidfile, 'r') as f:
                pid = int(f.read().strip())

            # remove the pidfile
            os.remove(self._pidfile)

            # kill daemon
            os.kill(pid, SIGTERM)

        else:
            raise Exception("Daemon is not started")


    def restart(self):
        self.stop()
        self.start()

2

পরিষেবার মতো চলমান এমন কিছু তৈরি করতে আপনি এই জিনিসটি ব্যবহার করতে পারেন:

আপনার প্রথমে যা করতে হবে তা সিমেন্ট ফ্রেমওয়ার্কটি ইনস্টল করা : সিমেন্ট ফ্রেমের কাজ হল একটি সিএলআই ফ্রেম কাজ যা আপনি এটিতে আপনার অ্যাপ্লিকেশন স্থাপন করতে পারেন।

অ্যাপ্লিকেশনটির কমান্ড লাইন ইন্টারফেস:

interface.py

 from cement.core.foundation import CementApp
 from cement.core.controller import CementBaseController, expose
 from YourApp import yourApp

 class Meta:
    label = 'base'
    description = "your application description"
    arguments = [
        (['-r' , '--run'],
          dict(action='store_true', help='Run your application')),
        (['-v', '--version'],
          dict(action='version', version="Your app version")),
        ]
        (['-s', '--stop'],
          dict(action='store_true', help="Stop your application")),
        ]

    @expose(hide=True)
    def default(self):
        if self.app.pargs.run:
            #Start to running the your app from there !
            YourApp.yourApp()
        if self.app.pargs.stop:
            #Stop your application
            YourApp.yourApp.stop()

 class App(CementApp):
       class Meta:
       label = 'Uptime'
       base_controller = 'base'
       handlers = [MyBaseController]

 with App() as app:
       app.run()

আপনার অ্যাপ.পি ক্লাস:

 import threading

 class yourApp:
     def __init__:
        self.loger = log_exception.exception_loger()
        thread = threading.Thread(target=self.start, args=())
        thread.daemon = True
        thread.start()

     def start(self):
        #Do every thing you want
        pass
     def stop(self):
        #Do some things to stop your application

মনে রাখবেন আপনার অ্যাপটি ডেমন করার জন্য অবশ্যই একটি থ্রেডে চলবে

অ্যাপটি চালানোর জন্য কমান্ড লাইনে এটি করুন

পাইথন ইন্টারফেস.পি - হেল্প


1

আপনার সিস্টেমে যা যা পরিষেবা ম্যানেজার অফার করে তা ব্যবহার করুন - উদাহরণস্বরূপ উবুন্টু-এর আওতায় আপস্টার্ট । এটি আপনার জন্য সমস্ত বিবরণ যেমন বুট শুরু করা, ক্রাশ পুনরায় চালু করা ইত্যাদি পরিচালনা করবে will

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.