Основной скрипт, который запускает, останавливает и контролирует другихPython

Программы на Python
Ответить
Anonymous
 Основной скрипт, который запускает, останавливает и контролирует других

Сообщение Anonymous »

Исходный вопрос:
У меня есть watchdog.py, этот скрипт должен обрабатывать другие скрипты, скажем, test1.py и test2.py
script1.py и script2.py запускаются самостоятельно в цикле, как, скажем, закрытые модули.
Единственная задача main.py — запустить и остановить другой, если необходимо, и перезапустить их, если возникнет ошибка (мониторинг).
Посмотрел popen и многопоточность, но не нашел способа отслеживать и перезапускать.Может ли кто-нибудь подсказать мне правильную процедуру или привести пример, как это сделать?
Мое решение на данный момент работает (в Linux) :
В основном я вызываю каждый скрипт с подпроцессом popen и уничтожаю его с помощью pkill. С моей точки зрения, это не лучшее решение, что возвращает меня к моему главному вопросу о правильной процедуре...
watchdog.py:
Основной сценарий, который выполняется в бесконечном цикле и при необходимости запускает, останавливает и перезапускает сценарии
whatchdog.ini:
Файл конфигурации, в котором определены скрипты и флаги запуска/остановки/перезапуска. Его можно изменить вручную или с помощью другого скрипта во время работы Whatchdog.py.
test1.py:
Простой тестовый скрипт, который печатает «Hello Test 1» каждые 10 секунд.
test2.py:
Простой тестовый скрипт, который печатает «Hello Test 1» каждые 10 секунд, но запускается с ошибкой после 2 раз (вызовет перезапуск, если флаг в ini равен 1)
Поместите все в папку и запустите watchdog.py, это тестовый скрипт, единственное, чего не хватает, это возможности установить полный путь к файлу для скриптов, но это легко изменить, если вы хотите его использовать...
Code Watchdog .py:
import time
import os
import subprocess
from multiprocessing import Process
import configparser

#Time interval how often should the watchdog script run (sec.)
interval = 10

# // FUNCTIONS //

# Function to read the config file

def read_config(section, key):
config = configparser.ConfigParser()
config.read('watchdog.ini')
return config[section][key]

# Function to start the Script as subprocess inside multiprocessing process

def start_script(scriptname):
sub_dict = {}
sub_id = "sub_id_" + scriptname
sub_variable_name = "start_" + scriptname
sub_variable_value = ['python', '' + str(scriptname) + '.py']
sub_dict[sub_variable_name] = sub_variable_value
sub_dict[sub_id] = sub_id
globals()[sub_dict[sub_id]] = subprocess.Popen(sub_dict[sub_variable_name])

# Function to kill (stop) a subprocess/script

def stop_script(scriptname):
command = 'pkill -f ' + str(scriptname) + '.py'
os.system(command);

# Check if subprocess/script is running
def running_script(scriptname):
sub_id = 'sub_id_' + scriptname
if sub_id in locals() or sub_id in globals():
if eval(sub_id).poll() == None:
#print(scriptname + ' is running')
return('running')
else:
#print(scriptname + ' not running')
return('stoped')
else:
return('not defined')

# // END FUNCTIONS //

# // MAIN LOOP //

while True:
# Loop throug sections of the config file to get all scripts
config = configparser.ConfigParser()
config.read('watchdog.ini')
all_section_names: list[str] = config.sections()
for section_name in all_section_names:
#print(section_name)
#Get start/stop/restart flags for the specific script
start = int(read_config(section_name, 'start'))
stop = int(read_config(section_name, 'stop'))
restart = int(read_config(section_name, 'restart'))
#Check Status running / stoped / not defined
status = str(running_script(section_name))
#Start script if start=1 and wasnt started before
if start == 1 and status == 'not defined':
start_script(section_name)
print(section_name + ' started')
# Stop the script if stop = 1
if stop == 1 and status != 'stoped' and status != 'not defined':
stop_script(section_name)
print(section_name + ' stoped')
# Restart script if restart = 1 and script was started before
if restart == 1 and status == 'stoped':
stop_script(section_name)
start_script(section_name)
print(section_name + ' restarted')
time.sleep(interval)

# // END MAIN LOOP //

Код watchdog.ini:
[test1]
start = 1
stop = 0
restart = 0

[test2]
start = 1
stop = 0
restart = 1

Код test1.py
# Scripts prints 'Hello Test 1' every 10sec and run without problems
import time

while True:
print('Hello Test 1')
time.sleep(10)

Код test2.py:
# Scripts prints 'Hello Test2" every 10sec but after two times it runs into an error and need to be / could be restarted by the main.py
import time

while True:
print("Hello Test 2")
time.sleep(10)
print("Hello Test 2")
time.sleep(10)
get.value


Подробнее здесь: https://stackoverflow.com/questions/791 ... tor-others
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»