Мултисървърен монитор/автоматично рестартиране в python

Имам 2 сървърни програми, които трябва да бъдат стартирани с помощта на GNU Screen. Бих искал да защитя тези сървъри срещу сривове с програма, базирана на Python, която стартира всяка екранна сесия, след което следи процеса на сървъра. Ако процесът на сървъра се срине, имам нужда от кода на Python, за да убия сесията на външния екран и да рестартирам сървъра с екран отново.

Аз съм много нов в Python, но използвам тази възможност да се обуча. Знам, че това може да се направи в bash скриптове. Но искам да надграждам този код за бъдещи функции, така че трябва да бъде само Python.

Псевдокодът е както следва:

thread-one {
     While 1:
     start server 1 using screen
     wait for server to end
     end while
}

thread-two {
     While 1:
     start server 2 using screen
     wait for server to end
     end while
}

person Caedis    schedule 21.05.2009    source източник
comment
Това всъщност нишки ли са? Или са дъщерни процеси?   -  person S.Lott    schedule 21.05.2009
comment
скриптът на python (мисля) ще трябва да бъде многонишков, за да се справи с рестартирането на две отделни програми независимо. Така че те са нишки, които стартират дъщерни процеси независимо.   -  person Caedis    schedule 21.05.2009


Отговори (2)


"трябва да бъде многонишков, за да се справи с рестартирането на две отделни програми"

Не виждам защо.

import subprocess

commands = [ ["p1"], ["p2"] ]
programs = [ subprocess.Popen(c) for c in commands ]
while True:
    for i in range(len(programs)):
        if programs[i].returncode is None:
            continue # still running
        else:
            # restart this one
            programs[i]= subprocess.Popen(commands[i])
        time.sleep(1.0)
person S.Lott    schedule 21.05.2009
comment
Уау, ще прекарам следващия час в дисекция на този код за всяка капка информация, която мога да извлека от него. Благодаря ти! - person Caedis; 21.05.2009

Наистина не трябва да стартирате производствен софтуер на екран. Ако сървърът се рестартира, как ще го стартирате? Ръчно? Също така мисля, че се опитвате да изобретите отново колелото. Вече има доста добри инструменти, които правят това, от което се нуждаете.

launchtool ви позволява да изпълнявате предоставена от потребителя команда, като контролирате нейното изпълнение по много начини, като например контролиране на нейната среда , блокиране на сигнали, регистриране на изхода му, промяна на потребителски и групови разрешения, ограничаване на използването на ресурси, рестартиране при неуспех, непрекъснато изпълнение, превръщане в демон и др.

.

Monit е безплатна помощна програма с отворен код за управление и наблюдение на процеси, файлове, директории и файлови системи в UNIX система . Monit извършва автоматична поддръжка и ремонт и може да изпълнява значими причинно-следствени действия в ситуации на грешка.

person Paweł Polewicz    schedule 21.05.2009
comment
Въпреки че сървърът се използва от моите клиенти, той не е критичен за мисията, това е тестов сървър за небизнес употреба. Сървърните програми, въпреки че е важно да се поддържат, няма да убият никого или ще струват пари на някого, ако умре. Основната цел на това упражнение е да създам полезна програма, която мога да разширя в бъдеще, докато изучавам Python. Открих, че уча най-добре, когато имам нужда да задоволя. Може да има приложения за това, но това проваля целта. - person Caedis; 21.05.2009