Вопрос

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

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

ps -ef | grep process name

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

OS X запустила

У Solaris есть 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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top