سؤال

أحتاج إلى اكتشاف عندما تعطل البرنامج أو لا يعمل باستخدام Python وإعادة تشغيله. أحتاج إلى طريقة لا تعتمد بالضرورة على وحدة Python هي العملية الأصلية.

أنا أفكر في تنفيذ حلقة أثناء وجودها أساسا

ps -ef | grep process name

وعندما لم يتم العثور على العملية، يبدأ آخر. ربما هذه ليست الطريقة الأكثر كفاءة. أنا جديد في بيثون، ربما تكون هناك وحدة بيثون التي تفعل ذلك بالفعل.

هل كانت مفيدة؟

المحلول

لماذا تنفذها بنفسك؟ فائدة موجودة مثل مخفي أو دبيان start-stop-daemon من المرجح أن تحصل على الأشياء الصعبة الأخرى حول تشغيل عمليات خادم حي طويل.

على أي حال، عندما تبدأ الخدمة، ضع PID في /var/run/<name>.pid ثم جعل الخاص بك ps أمر فقط ابحث عن معرف العملية هذا، والتحقق من أنها العملية المناسبة. على لينكس يمكنك ببساطة إلقاء نظرة على /proc/<pid>/exe للتحقق من أنه يشير إلى اليمين القابل للتنفيذ.

نصائح أخرى

من فضلك لا إعادة اختراع init. يحتوي نظام التشغيل الخاص بك على قدرات للقيام بذلك والتي تتطلب أي موارد نظام تقريبا وسوف تفعل ذلك بشكل أفضل وأكثر موثوقا من أي شيء يمكنك إعادة إنتاجه.

كلاسيكي لينكس لديه / الخ / inittab

ubuntu لديه /etc/event.d (upstart)

OS X لديه إطلاق

سولاريس لديه SMF.

الشفرة التالية يتحقق عملية معينة في فاصل زمني معين، وإعادة تشغيله.

#Restarts a given process if it is finished.
#Compatible with Python 2.5, tested on Windows XP.
import threading
import time
import subprocess

class ProcessChecker(threading.Thread):
    def __init__(self, process_path, check_interval):
        threading.Thread.__init__(self)
        self.process_path = process_path
        self.check_interval = check_interval

    def run (self):
        while(1):
            time.sleep(self.check_interval)
            if self.is_ok():
                self.make_sure_process_is_running()

    def is_ok(self):
        ok = True
        #do the database locks, client data corruption check here,
        #and return true/false
        return ok

    def make_sure_process_is_running(self):
        #This call is blocking, it will wait for the
        #other sub process to be finished.
        retval = subprocess.call(self.process_path)

def main():
    process_path = "notepad.exe"
    check_interval = 1 #In seconds
    pm = ProcessChecker(process_path, check_interval)
    pm.start()
    print "Checker started..."

if __name__ == "__main__":
    main()

ربما تحتاج http://supervisord.org.

لم أحاول ذلك بنفسي، لكن هناك معلومات نظام بيثون الوحدة النمطية التي يمكن استخدامها للعثور على العمليات والحصول على معلومات عنها. afair هناك ProcessTable فئة يمكن استخدامها لتفقد العمليات الجارية، ولكن لا يبدو أنها موثقة جيدا ...

سأذهب مسار سطر الأوامر (إنه مجرد IMHO فقط) طالما أنك تحقق فقط من كل ثانية أو اثنين يجب أن يكون استخدام الموارد غير مصنف بالمقارنة مع المعالجة المتاحة على أي نظام أقل من 10 سنوات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top