|
|
|
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)
|
|
|
|
|