Авто-перезагрузка системы в Python - PullRequest
5 голосов
/ 23 мая 2009

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

Я рассматриваю возможность реализации цикла while, который по существу делает

ps -ef | grep process name

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

Ответы [ 6 ]

5 голосов
/ 23 мая 2009

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

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

3 голосов
/ 23 мая 2009

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

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

В Ubuntu есть /etc/event.d (upstart)

OS X запустил

Солярис имеет смф

1 голос
/ 07 октября 2011

может быть, вам нужно http://supervisord.org

1 голос
/ 24 мая 2009

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

#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()
0 голосов
/ 23 мая 2009

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

0 голосов
/ 23 мая 2009

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

...