import subprocess import json import datetime import time import codecs import os import signal #Чтение конфигурации lDaemonConfigurationFile = codecs.open("robotDaemonConfiguration.json", "r","utf_8_sig") lDaemonConfigurationJSONString = lDaemonConfigurationFile.read() #Закрыть файловый объект lDaemonConfigurationFile.close() #Преобразование в JSON lDaemonConfigurationObject=json.loads(lDaemonConfigurationJSONString) #Инициализация настроечных параметров lDaemonLoopSeconds=lDaemonConfigurationObject["loopSeconds"] lDaemonProcessCodeProcessDict={} lCurrentDateTime=datetime.datetime.now() #Вечный цикл while True: #Циклический обход правил lFlagSearchActivityType=True for lItem in lDaemonConfigurationObject["activityList"]: if lFlagSearchActivityType: #Определить вид активности if lItem["activityType"]=="processStart": #Вид активности - запуск процесса #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M") lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило if lCurrentDateTime>=lActivityDateTime and lItem["processCode"] not in lDaemonProcessCodeProcessDict: #Выполнить операцию print("ProcessStart:"+lItem["processPath"]) lFlagSearchActivityType=False lDaemonProcessCodeProcessDict[lItem["processCode"]]=subprocess.Popen([lItem["processPath"],lItem["processArgs"]],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #Определить вид активности if lItem["activityType"]=="processEnd": #Вид активности - остановка процесса #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M") lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило if lCurrentDateTime>=lActivityDateTime and lItem["processCode"] in lDaemonProcessCodeProcessDict: print() #Выполнить операцию lProcess=lDaemonProcessCodeProcessDict[lItem["processCode"]] lProcess.kill() #os.kill(lProcess.pid, signal.SIGTERM) # Send the signal to all the process groups lFlagSearchActivityType=False #Очистить словарь del lDaemonProcessCodeProcessDict[lItem["processCode"]] #Уснуть до следующего прогона time.sleep(lDaemonLoopSeconds)