পাইথন স্ক্রিপ্ট চলছে কিনা তা পরীক্ষা করে দেখুন


104

আমার ওয়েব অ্যাপের অংশ হিসাবে আমার একটি পাইথন ডেমন চলছে / আমি কীভাবে আমার ডেমনটি চালাচ্ছি এবং যদি তা না করে চালু করি তবে কীভাবে আমি দ্রুত (পাইথন ব্যবহার করে) পরীক্ষা করতে পারি?

ডেমনের কোনও ক্র্যাশ ঠিক করার জন্য আমি সেভাবে এটি করতে চাই এবং তাই স্ক্রিপ্টটি ম্যানুয়ালি চালাতে হবে না, এটি ডাকার সাথে সাথে এটি স্বয়ংক্রিয়ভাবে চলবে এবং তারপরে চলতে থাকবে।

আমার স্ক্রিপ্ট চলতে থাকলে আমি কীভাবে (অজগর ব্যবহার করে) পরীক্ষা করতে পারি?


আপনি কি নিশ্চিত যে আপনার প্রক্রিয়াটিও আপনার অন্যান্য প্রক্রিয়াটি অজগরে লেখা থাকে না?
ojblass

টেন্ডোতে যান, আপনার স্ক্রিপ্টের একক ঘটনা তৈরি করে, সুতরাং ইতিমধ্যে এটি চালু থাকলে স্ক্রিপ্টটি চলবে না। github.com/pycontribs/tendo
জেসটোনএচাইয়ার

এটি আপনার ডেমোন কাজ নয়, এটি আপনার উচ্চতা প্রয়োগকারী "উচ্চ" অ্যাপ্লিকেশনটির কাজ। সিস্টেমড বা সুপারভাইজারের মতো অন্য কোনও সরঞ্জাম ব্যবহার করুন। কোনও ফাইলে লেখা পিডের উপর নির্ভর করবেন না। যদি আপনি সিস্টেমেড / সুপারভাইজার ব্যবহার করতে না পারেন তবে লকিংটি ব্যবহার করে নিশ্চিত করুন এটি দু'বার কার্যকর হয় না।
গেটলি

উত্তর:


94

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

#/usr/bin/env python

import os
import sys

pid = str(os.getpid())
pidfile = "/tmp/mydaemon.pid"

if os.path.isfile(pidfile):
    print "%s already exists, exiting" % pidfile
    sys.exit()
file(pidfile, 'w').write(pid)
try:
    # Do some actual work here
finally:
    os.unlink(pidfile)

তারপরে /tmp/mydaemon.pid এর সামগ্রীগুলি বিদ্যমান প্রক্রিয়া কিনা তা পরীক্ষা করে আপনি প্রক্রিয়াটি চলছে কিনা তা পরীক্ষা করে দেখতে পারেন। মনিট (উপরে উল্লিখিত) আপনার জন্য এটি করতে পারে, বা আপনি পিএস থেকে রিটার্ন কোড ব্যবহার করে এটি পরীক্ষা করার জন্য একটি সাধারণ শেল স্ক্রিপ্ট লিখতে পারেন।

ps up `cat /tmp/mydaemon.pid ` >/dev/null && echo "Running" || echo "Not running"

অতিরিক্ত creditণের জন্য, আপনি আপনার প্রোগ্রামটি যে কোনও পরিস্থিতিতে (যখন মারা যায়, ব্যতিক্রমগুলি উত্থাপিত হয় ইত্যাদি) তার পিডফাইলে পরিষ্কার করে তা নিশ্চিত করতে অ্যাক্সিট মডিউলটি ব্যবহার করতে পারেন।


7
যদি প্রোগ্রামটি ভেঙে যায়, os.unlink () কার্যকর হবে না এবং প্রোগ্রামটি আবার চলবে না, কারণ ফাইলটি বিদ্যমান। ঠিক?
Yuda Prawira

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

7
যদিও একটি সহজ সমাধান, এটি একটি জাতি শর্তের জন্য সংবেদনশীল। যদি স্ক্রিপ্টের দুটি উদাহরণ প্রায় একই সময়ে কার্যকর করা হয় তবে এটি if os.path.isfile(pidfile)উভয়ের পক্ষে মিথ্যা বলে মূল্যায়ন করতে পারে, যার ফলে তারা লক ফাইলটি লিখতে এবং চালিয়ে যেতে পারে।
সেরিন

6
অপারেটিং সিস্টেম দ্বারা পিডগুলিও পুনরায় ব্যবহৃত হয়। সুতরাং মিথ্যা ইতিবাচক সম্ভাবনা রয়েছে।
aychedee

12
যারা এখন এটি খুঁজে পান তাদের জন্য নোট করুন যে অজগর 3 file()এ সরানো হয়েছিল এবং তার open()পরিবর্তে আপনার ব্যবহার করা উচিত । অতিরিক্ত হিসাবে, আপনি এখানে ২.7 এর open()উপরে থাকলেও আপনারfile() এখানে বর্ণিত হিসাবে ব্যবহার করা উচিত : ডকস.পিথথন.আর / / লাইব্রেরি / ফাংশনস html#file (এবং হ্যাঁ, আপনি যদি পাইথনটি ২.২ এর কাছাকাছি ব্যবহার করেন তবে সরকারী পরামর্শটি এর বিপরীত ছিল। স্পষ্টতই তারা তাদের মন পরিবর্তন করেছে))
jpk

158

লিনাক্স সিস্টেমে কার্যকর এমন একটি প্রযুক্তি ডোমেন সকেট ব্যবহার করছে:

import socket
import sys
import time

def get_lock(process_name):
    # Without holding a reference to our socket somewhere it gets garbage
    # collected when the function exits
    get_lock._lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

    try:
        # The null byte (\0) means the socket is created 
        # in the abstract namespace instead of being created 
        # on the file system itself.
        # Works only in Linux
        get_lock._lock_socket.bind('\0' + process_name)
        print 'I got the lock'
    except socket.error:
        print 'lock exists'
        sys.exit()


get_lock('running_test')
while True:
    time.sleep(3)

এটি পারমাণবিক এবং যদি আপনার প্রক্রিয়াটি একটি সিগ্কিল প্রেরণ করা হয় তবে লক ফাইলগুলির চারপাশে থাকা সমস্যাটি এড়ানো হয়

আপনি ডকুমেন্টেশনে পড়তেsocket.close পারেন যে সকেটগুলি আবর্জনা সংগ্রহ করা হলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।


21
ভবিষ্যতের গুগলদের জন্য একটি নোট: এই কোডটি "অ্যাবস্ট্রাক্ট সকেট" ব্যবহার করে, যা লিনাক্স-নির্দিষ্ট (সাধারণভাবে পোস্টিক্স নয়)। এই বিষয়ে আরও: blog.eduardofleury.com/archives/2007/09/13
গেয়র্গ

6
এটি দুর্দান্ত, এবং এটি কোনও বোকা লম্বা ফাইল রাখে না। আশা করি আমি এই আরও upvote করতে পারে।
Hiro2k

4
অসাধারণ. তবে আমি অবাক হয়েছি কেন লক_সকেট বিশ্বব্যাপী সংজ্ঞায়িত। আমি পরীক্ষা করেছি এবং যদি লক_সকেট বিশ্বব্যাপী সংজ্ঞায়িত না হয় তবে একাধিক প্রক্রিয়া চলাকালীন লকিং সিস্টেমটি কাজ করে না। কেন? লক_সকেট সংজ্ঞায়িত করা হয় এবং কেবল get_lock ফাংশনে ব্যবহৃত হয়। কেন এটি বিশ্বব্যাপী সংজ্ঞায়িত করতে হবে?
আল্টুগুয়ে

7
আমি যখন এটি লিখেছি তার বেশ কিছুদিন হয়েছে ... এবং আমার স্মৃতি বেহাল। তবে আমি মনে করি এটি আবশ্যক কারণ এটি আবর্জনা সংগ্রহ করে এবং সকেটটি অন্যথায় বন্ধ হয়ে যায়। এরকম কিছু.
আইচডি

8
নাল বাইট ( \0) এর অর্থ সকেটটি ফাইল সিস্টেমে তৈরি না হয়ে বিমূর্ত নামস্থানে তৈরি করা হয়েছিল।
aychedee

23

PID গ্রন্থাগার ঠিক এটা করতে পারেন।

from pid import PidFile

with PidFile():
  do_something()

এটি স্বয়ংক্রিয়ভাবে কেস পরিচালনা করবে যেখানে পিডফিল রয়েছে তবে প্রক্রিয়া চলছে না।


এটি সুন্দরভাবে কাজ করে। উবুন্টুতে চালানোর জন্য এটি কেবল রুট হিসাবে চালাতে হবে। +1
জিমি

11
@ জিমি আপনি উদাহরণস্বরূপ with PidFile(piddir='/home/user/run/')যেখানে আপনার অনুমতি রয়েছে সেখানে পিড ফাইল রাখার জন্য একটি ভিন্ন ডিরেক্টরি ব্যবহার করতে পারেন। তারপরে আপনাকে এটি রুট হিসাবে চালানোর দরকার নেই
ডেকো

আমি ভাবছি যে এখানে বর্ণিত হিসাবে অস্থায়ী ডিরেক্টরি ব্যবহার করা পিডির জন্য একটি ভাল বিকল্প হবে।
ষি লাচমিপারসাদ

@ Iষিলেচমিয়ারস্যাড gettempdir ব্যবহার করা ভাল ধারণা হবে না কারণ এটি প্রতিটি কলটিতে একটি অনন্য ডিরেক্টরি দেবে যা পিড চেকটি ভেঙে দেবে। প্রতিবার স্ক্রিপ্ট চললে ডিরেক্টরিটি একই হওয়া দরকার।
ডেকো

ধন্যবাদ! এটি ব্যতিক্রম উত্থাপিত হলেও ভাল কাজ করে।
চাউ হংবো

11

অবশ্যই ড্যানের উদাহরণটি যেমনটি হওয়া উচিত তেমন কাজ করবে না।

প্রকৃতপক্ষে, যদি স্ক্রিপ্টটি ক্রাশ হয়, একটি ব্যতিক্রম উত্থাপন করে, বা পিড ফাইলটি পরিষ্কার না করে, স্ক্রিপ্টটি একাধিকবার চালানো হবে।

আমি অন্য ওয়েবসাইট থেকে নিম্নলিখিত ভিত্তিক প্রস্তাব:

এটি ইতিমধ্যে কোনও লক ফাইল বিদ্যমান কিনা তা পরীক্ষা করতে হবে

\#/usr/bin/env python
import os
import sys
if os.access(os.path.expanduser("~/.lockfile.vestibular.lock"), os.F_OK):
        #if the lockfile is already there then check the PID number
        #in the lock file
        pidfile = open(os.path.expanduser("~/.lockfile.vestibular.lock"), "r")
        pidfile.seek(0)
        old_pid = pidfile.readline()
        # Now we check the PID from lock file matches to the current
        # process PID
        if os.path.exists("/proc/%s" % old_pid):
                print "You already have an instance of the program running"
                print "It is running as process %s," % old_pid
                sys.exit(1)
        else:
                print "File is there but the program is not running"
                print "Removing lock file for the: %s as it can be there because of the program last time it was run" % old_pid
                os.remove(os.path.expanduser("~/.lockfile.vestibular.lock"))

এটি কোডের একটি অংশ যেখানে আমরা লক ফাইলে একটি পিআইডি ফাইল রাখি

pidfile = open(os.path.expanduser("~/.lockfile.vestibular.lock"), "w")
pidfile.write("%s" % os.getpid())
pidfile.close()

এই কোডটি চলমান চলমান প্রক্রিয়ার তুলনায় পিডের মান পরীক্ষা করবে,

আমি আশা করি এটি সাহায্য করবে


4
একটি ব্যবহার করা উচিত os.kill(old_pid, 0), যা ইউনিক্সে আরও বহনযোগ্য হওয়া উচিত। এটি উত্থাপন করবে OSErrorযদি এরকম কোনও পিআইডি না থাকে বা এটি বিভিন্ন ব্যবহারকারীর অন্তর্ভুক্ত থাকে।
drdaeman

4
সচেতন থাকুন যে কোনও প্রক্রিয়া পরীক্ষা করার জন্য / proc / <pid> ব্যবহার করা চূড়ান্তভাবে বহনযোগ্য নয় এবং এটি কেবল নির্ভরযোগ্যভাবে লিনাক্সে কাজ করবে।
ড্যান উদে

10

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


আমি সম্মতি জানাই, চাকাটি পুনরায় উদ্ভাবন করবেন না, আপনার অ্যাপটি মারা গেলে পুনরায় চালু করা, চলমান না হলে লঞ্চ করা ইত্যাদিসহ অনেকগুলি উপায় রয়েছে
ডেভর

8

আমার সমাধানটি উইন্ডো এবং উবুন্টু লিনাক্সে পরীক্ষিত প্রক্রিয়া এবং কমান্ড লাইন আর্গুমেন্টগুলির জন্য পরীক্ষা করা

import psutil
import os

def is_running(script):
    for q in psutil.process_iter():
        if q.name().startswith('python'):
            if len(q.cmdline())>1 and script in q.cmdline()[1] and q.pid !=os.getpid():
                print("'{}' Process is already running".format(script))
                return True

    return False


if not is_running("test.py"):
    n = input("What is Your Name? ")
    print ("Hello " + n)

@Nst এর উত্তরের পাশাপাশি, এটি আরও ভাল উত্তর।
shgnInc

5

বিকল্পগুলির একটি অগণিত আছে। একটি পদ্ধতি হ'ল সিস্টেম কল বা পাইথন লাইব্রেরি যা আপনার জন্য এই জাতীয় কলগুলি করে। অন্যটি কেবল এই জাতীয় প্রক্রিয়া চালিয়ে যায়:

ps ax | grep processName

এবং আউটপুট পার্স। অনেক লোক এই পদ্ধতির চয়ন করেন, এটি অগত্যা আমার দৃষ্টিতে খারাপ দৃষ্টিভঙ্গি নয়।


প্রক্রিয়া নামটি আমার স্ক্রিপ্টের ফাইলের নাম অন্তর্ভুক্ত করবে?
জোশ হান্ট

আপনি আপনার প্রক্রিয়াটি কীভাবে শুরু করবেন তা নির্ভর করে
ওজব্লাস 7

উদাহরণস্বরূপ: পিএস কুড়াল | গ্রেপ পাইথন
ব্যবহারকারী

3

এই পুরানো প্রশ্নটি পেরিয়ে এসেছি সমাধানের সন্ধান আমি।

Psutil ব্যবহার করুন :

import psutil
import sys
from subprocess import Popen

for process in psutil.process_iter():
    if process.cmdline() == ['python', 'your_script.py']:
        sys.exit('Process found: exiting.')

print('Process not found: starting it.')
Popen(['python', 'your_script.py'])

এই স্ক্রিপ্টটি অবশ্যই সুডো হিসাবে চালানো উচিত বা আপনি অ্যাক্সেস অস্বীকার ত্রুটি পাবেন।
ডেটাটা

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

2

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


2

এই অন্যান্য সংস্করণ চেষ্টা করুন

def checkPidRunning(pid):        
    '''Check For the existence of a unix pid.
    '''
    try:
        os.kill(pid, 0)
    except OSError:
        return False
    else:
        return True

# Entry point
if __name__ == '__main__':
    pid = str(os.getpid())
    pidfile = os.path.join("/", "tmp", __program__+".pid")

    if os.path.isfile(pidfile) and checkPidRunning(int(file(pidfile,'r').readlines()[0])):
            print "%s already exists, exiting" % pidfile
            sys.exit()
    else:
        file(pidfile, 'w').write(pid)

    # Do some actual work here
    main()

    os.unlink(pidfile)

1

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



0
ps ax | grep processName

যদি পাইচার্মে ইয়োর ডিবাগ স্ক্রিপ্ট সর্বদা প্রস্থান করে

pydevd.py --multiproc --client 127.0.0.1 --port 33882 --file processName

0

এটা চেষ্টা কর:

#/usr/bin/env python
import os, sys, atexit

try:
    # Set PID file
    def set_pid_file():
        pid = str(os.getpid())
        f = open('myCode.pid', 'w')
        f.write(pid)
        f.close()

    def goodby():
        pid = str('myCode.pid')
        os.remove(pid)

    atexit.register(goodby)
    set_pid_file()
    # Place your code here

except KeyboardInterrupt:
    sys.exit(0)

0

এখানে আরও দরকারী কোড রয়েছে (সঠিকভাবে পাইথন স্ক্রিপ্টটি কার্যকর করে কিনা তা পরীক্ষা করে):

#! /usr/bin/env python

import os
from sys import exit


def checkPidRunning(pid):
    global script_name
    if pid<1:
        print "Incorrect pid number!"
        exit()
    try:
        os.kill(pid, 0)
    except OSError:
        print "Abnormal termination of previous process."
        return False
    else:
        ps_command = "ps -o command= %s | grep -Eq 'python .*/%s'" % (pid,script_name)
        process_exist = os.system(ps_command)
        if process_exist == 0:
            return True
        else:
            print "Process with pid %s is not a Python process. Continue..." % pid
            return False


if __name__ == '__main__':
    script_name = os.path.basename(__file__)
    pid = str(os.getpid())
    pidfile = os.path.join("/", "tmp/", script_name+".pid")
    if os.path.isfile(pidfile):
        print "Warning! Pid file %s existing. Checking for process..." % pidfile
        r_pid = int(file(pidfile,'r').readlines()[0])
        if checkPidRunning(r_pid):
            print "Python process with pid = %s is already running. Exit!" % r_pid
            exit()
        else:
            file(pidfile, 'w').write(pid)
    else:
        file(pidfile, 'w').write(pid)

# main programm
....
....

os.unlink(pidfile)

এখানে স্ট্রিং রয়েছে:

ps_command = "ps -o command= %s | grep -Eq 'python .*/%s'" % (pid,script_name)

"গ্রেপ" সফল হলে 0 প্রদান করে এবং "পাইথন" প্রক্রিয়াটি বর্তমানে আপনার স্ক্রিপ্টটির সাথে পরামিতি হিসাবে চলছে name


0

একটি সহজ উদাহরণ যদি আপনি কেবলমাত্র কোনও প্রক্রিয়া নামটির সন্ধান করেন বা না থাকলে:

import os

def pname_exists(inp):
    os.system('ps -ef > /tmp/psef')
    lines=open('/tmp/psef', 'r').read().split('\n')
    res=[i for i in lines if inp in i]
    return True if res else False

Result:
In [21]: pname_exists('syslog')
Out[21]: True

In [22]: pname_exists('syslog_')
Out[22]: False

-1

আপনার সমস্যা সমাধানের জন্য নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

#!/usr/bin/python
# -*- coding: latin-1 -*-

import os, sys, time, signal

def termination_handler (signum,frame):
    global running
    global pidfile
    print 'You have requested to terminate the application...'
    sys.stdout.flush()
    running = 0
    os.unlink(pidfile)

running = 1
signal.signal(signal.SIGINT,termination_handler)

pid = str(os.getpid())
pidfile = '/tmp/'+os.path.basename(__file__).split('.')[0]+'.pid'

if os.path.isfile(pidfile):
    print "%s already exists, exiting" % pidfile
    sys.exit()
else:
    file(pidfile, 'w').write(pid)

# Do some actual work here

while running:
  time.sleep(10)

আমি এই স্ক্রিপ্টটি পরামর্শ দিচ্ছি কারণ এটি কেবল একবারে কার্যকর করা যেতে পারে।


-1

বর্তমান স্ক্রিপ্টের নাম সহ কোনও প্রক্রিয়া সন্ধান করতে ব্যাশ ব্যবহার করা। কোনও অতিরিক্ত ফাইল নেই।

import commands
import os
import time
import sys

def stop_if_already_running():
    script_name = os.path.basename(__file__)
    l = commands.getstatusoutput("ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'" % script_name)
    if l[1]:
        sys.exit(0);

পরীক্ষা করতে, যোগ করুন

stop_if_already_running()
print "running normally"
while True:
    time.sleep(3)

অতিরিক্ত ফাইল ছাড়াও 6 টি অতিরিক্ত প্রক্রিয়া নেই?
অ্যালোস মাহডাল

4
এবং আমি ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'এবং যে জিনিস চালাতে হবে? ;)
আলাইস মাহডাল

আমি কি বুঝতে পারছি না ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}' করছে। যদি নাম অনুসারে কোনও প্রক্রিয়া অনুসন্ধান করতে হয় তবে কেন ব্যবহার pgrepকরবেন না ? এর উদ্দেশ্য কী awk '{print $2}'| awk '{print $2}'? সাধারণভাবে, আপনি ডিলিমিটারটি পরিবর্তন না করে আপনি এর মতো পরপর দু'বার বুদ্ধি চালাতে পারবেন না। পিআইডি কলামে প্রথম অজানা ফলাফল ... দ্বিতীয় উত্তম ফলাফলের কিছুই হবে না।
ছয়

-1

ইতিমধ্যে চালু থাকলে স্ক্রিপ্ট শুরু করা এড়াতে আমি লিনাক্সে এটি ব্যবহার করি:

import os
import sys


script_name = os.path.basename(__file__)
pidfile = os.path.join("/tmp", os.path.splitext(script_name)[0]) + ".pid"


def create_pidfile():
    if os.path.exists(pidfile):
        with open(pidfile, "r") as _file:
            last_pid = int(_file.read())

        # Checking if process is still running
        last_process_cmdline = "/proc/%d/cmdline" % last_pid
        if os.path.exists(last_process_cmdline):
            with open(last_process_cmdline, "r") as _file:
                cmdline = _file.read()
            if script_name in cmdline:
                raise Exception("Script already running...")

    with open(pidfile, "w") as _file:
        pid = str(os.getpid())
        _file.write(pid)


def main():
    """Your application logic goes here"""


if __name__ == "__main__":
    create_pidfile()
    main()

এই পদ্ধতির কোনও বাহ্যিক মডিউলে কোনও নির্ভরতা ছাড়াই ভাল কাজ করে।

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