2009-05-23 19 views
5

Bir program çöktüğünde veya python kullanarak çalışmadığında algılamalı ve yeniden başlatmalıyım. Ana işlem olan python modülüne güvenmeyen bir yönteme ihtiyacım var.Python'da otomatik yeniden başlatma sistemi

Ben esasen

ps -ef | grep process name 

yapar ve süreç bulunmazsa zaman başka başlatan bir süre döngü uygulayan düşünüyorum. Belki de bu en verimli yöntem değildir. Python için yeniyim, muhtemelen bunu zaten yapan bir python modülü var.

cevap

5

Neden kendiniz uygulayın? daemon veya Debian'ın start-stop-daemon gibi mevcut bir yardımcı program, uzun ömürlü sunucu işlemlerini çalıştırmanın diğer zor şeylerini alma olasılığı daha yüksektir.

Neyse, hizmeti başlattığınızda, pidini /var/run/<name>.pid'a koyun ve daha sonra ps komutunuzu bu işlem kimliğine bakın ve doğru işlem olup olmadığını kontrol edin. Linux'ta, doğru yürütülebilir dosyayı işaret ettiğinden emin olmak için /proc/<pid>/exe'a bakabilirsiniz.

+0

İzlenen program kümesinin benzersiz niteliği nedeniyle, bunlar daemonlara dönüştürülemez. Böylece geleneksel izleme yöntemleri benim için mevcut değildir. Ek olarak, dış kodlara güvenmek yerine kendimi güzel bir modülde daha rahat hissedebileceğim bazı özelliklere ihtiyacım var. /proc/ Caedis

0

Kendim denemedim, ancak işlemleri bulmak ve bunlar hakkında bilgi almak için kullanılabilecek bir Python System Information modülü var. AFAIR orada çalışan süreçleri incelemek için kullanılabilecek bir ProcessTable sınıfı, ama çok iyi belgelenmiş gibi görünmüyor ...

+0

Teşekkür gerekiyor! Buna bakacağım. – Caedis

0

Komut satırı rotası (sadece daha kolay imho) gitmek istiyorum Sadece her iki saniyede bir kontrol ettiğiniz sürece, kaynak kullanımı 10 yaşından küçük herhangi bir sistemde mevcut işleme kıyasla az olmalıdır.

+0

Muhtemelen ps komutunu ayrıştırarak veya/proc dizinini tarayarak olur. – Caedis

3

Lütfen init'i yeniden keşfetmeyin. İşletim Sisteminizin, neredeyse hiç sistem kaynağı gerektirmeyen ve bunu yeniden üretebileceğiniz her şeyden daha iyi ve güvenilir bir şekilde yapacak olan yetenekleri vardır.

Klasik Linux

inittab Ubuntu OS X

+0

Yine, izlediğim süreçlerin benzersiz doğası, onların basit bir arka plandan farklı olarak ele alınmasını gerektiriyor. İşlemlerin yeniden başlatılmasını, veritabanı kilitlerini, istemci veri bozulmasını kullanamam. Sunucu işleminin yeniden başlatılmasından önce verilerin doğrulanması gerekir. Bu yüzden ciddi sorunları önlemek için bunu python'a kodlamalıyım. – Caedis

+0

İsterseniz otomatik yeniden başlatmayı istersiniz veya istemezsiniz. Eğer yaparsanız, işletim sisteminizin init, vb.Eğer yapmazsanız, tüm sorunuz ve başlık, niyetinizin karşıtlığını ifade eder. – Dustin

1

smf olan

Solaris launchd olan

(sonradan görme) Aşağıdaki kod kontrol /etc/event.d/etc/var Verilen bir süreçte verilen süreç ve tekrar başlatır.

#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() 
İlgili konular