نظام إعادة التشغيل التلقائي في بيثون
سؤال
أحتاج إلى اكتشاف عندما تعطل البرنامج أو لا يعمل باستخدام 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 سنوات.