Система авторестарта в Python

Условия, которые вы описываете, не будут удовлетворены HashMap. Поскольку процесс обновления карты не является атомарным, вы можете встретить карту в недопустимом состоянии. Многократные записи могут оставить это в поврежденном состоянии. ConcurrentHashMap (1.5 или более поздняя версия) делает то, что вы хотите.

5
задан Jonathan Leffler 3 March 2010 в 06:44
поделиться

5 ответов

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

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

5
ответ дан 13 December 2019 в 22:15
поделиться

Please don't reinvent init. Your OS has capabilities to do this that require nearly no system resources and will definitely do it better and more reliably than anything you can reproduce.

Classic Linux has /etc/inittab

Ubuntu has /etc/event.d (upstart)

OS X has launchd

Solaris has smf

3
ответ дан 13 December 2019 в 22:15
поделиться

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

#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()
1
ответ дан 13 December 2019 в 22:15
поделиться

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

0
ответ дан 13 December 2019 в 22:15
поделиться

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

0
ответ дан 13 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: