Автоматический перезапуск системы на Python
Вопрос
Мне нужно определить, когда программа выходит из строя или не запускается с использованием 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 лет.