2009-05-23 2 views
5

Мне нужно определить, когда программа вылетает или не работает с использованием python и перезагружает ее. Мне нужен метод, который не обязательно полагается на модуль python, являющийся родительским процессом.Система автоматического перезапуска в Python

Я рассматриваю реализации цикла в то время как по существу делает

ps -ef | grep process name 

и когда этот процесс не нашел, что это начинается другой. Возможно, это не самый эффективный метод. Я новичок в python, поэтому, возможно, есть модуль python, который делает это уже.

ответ

5

Зачем внедрять его самостоятельно? Существующая утилита, такая как daemon или Debian's start-stop-daemon, с большей вероятностью получит другие трудные вещи, касающиеся работы долгоживущих серверных процессов.

В любом случае, когда вы запустите сервис, поместите его pid в /var/run/<name>.pid, а затем сделайте команду ps, просто найдите этот идентификатор процесса и убедитесь, что это правильный процесс. В Linux вы можете просто посмотреть на /proc/<pid>/exe, чтобы проверить, что он указывает на правильный исполняемый файл.

+0

Благодаря уникальной природе контролируемого набора программ они не могут быть превращены в демонов. Таким образом, обычные методы мониторинга недоступны для меня. Кроме того, мне нужны определенные функции, которые я бы чувствовал более комфортно, реализовывая себя в одном красивом аккуратном модуле, а не полагаясь на внешний код. Спасибо за/proc/ Caedis

0

Я не пробовал это сам, но есть модуль Python System Information, который может быть использован для поиска процессов и получения информации о них. AFAIR существует класс ProcessTable, который может быть использован для проверки запущенных процессов, но он, похоже, не очень хорошо документирован ...

+0

Спасибо! Я займусь этим. – Caedis

0

Я бы пошел по маршруту командной строки (это просто проще imho), так как если вы проверяете только каждую секунду или две, использование ресурсов должно быть минимальным по сравнению с доступной обработкой в ​​любой системе, которой меньше 10 лет.

+0

Я, вероятно, буду либо разбор команды ps, либо поиск каталога/proc. – Caedis

3

Пожалуйста, не изобретайте init. У вашей ОС есть возможности для этого, которые не требуют почти никаких системных ресурсов и определенно сделают это лучше и надежнее, чем все, что вы можете воспроизвести.

Классический Linux имеет/и т.д./inittab

Ubuntu имеет /etc/event.d (выскочка)

OS X имеет

запуск программ

Solaris имеет Smf

+0

Опять же, уникальная природа процессов, которые я контролирую, требует, чтобы их обрабатывали иначе, чем простой демон. Я не могу просто перезапустить процессы, блокировки базы данных, повреждение данных клиента. Данные должны быть проверены перед перезапуском процесса сервера. Поэтому мне нужно настроить код на python для предотвращения серьезных проблем. – Caedis

+0

Вы либо хотите автоматические перезагрузки, либо нет. Если вы это сделаете, вы хотите, чтобы ваша ОС выполняла его через init и т. Д.Если вы этого не сделаете, то ваш весь вопрос и название выражают противоположность вашим намерениям. – Dustin

1

Следующий код проверяет данный процесс в заданном интервале, и перезапускает его.

#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() 
Смежные вопросы