test ArchiveEngine monitor

alarm if engine is not running
This commit is contained in:
Michael Davidsaver
2014-02-17 15:51:59 -05:00
parent e314f77805
commit 5882d518ee
5 changed files with 107 additions and 0 deletions

View File

@ -0,0 +1,5 @@
TOP = ../..
include $(TOP)/configure/CONFIG
ARCH = linux-x86_64
TARGETS = envPaths
include $(TOP)/configure/RULES.ioc

18
iocBoot/iocarchivemon/st.cmd Executable file
View File

@ -0,0 +1,18 @@
#!../../bin/linux-x86_64/softIocPy2.6
< envPaths
dbLoadDatabase("../../dbd/softIocPy.dbd",0,0)
softIocPy_registerRecordDeviceDriver(pdbbase)
py "import logging"
py "logging.basicConfig(level=logging.INFO)"
epicsEnvSet("BASE","/var/cache/channelarchiver")
epicsEnvSet("PPAT","The original process ID was ([0-9]+)")
dbLoadRecords("../../db/pidmon.db","N=ACC-CT{Bck}General-I,SCAN=10 second,FILE=$(BASE)/general/archive_active.lck,PAT=$(PAT)")
iocInit()
dbl > records.dbl

13
pidMonApp/Makefile Normal file
View File

@ -0,0 +1,13 @@
TOP=..
include $(TOP)/configure/CONFIG
include $(TOP)/configure/CONFIG_PY
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE
DB += pidmon.db
PY += pidmon.py
include $(TOP)/configure/RULES
include $(TOP)/configure/RULES_PY
#----------------------------------------
# ADD RULES AFTER THIS LINE

8
pidMonApp/pidmon.db Normal file
View File

@ -0,0 +1,8 @@
record(stringin, "$(N)") {
field(DTYP, "Python Device")
field(INP , "@pidmon")
field(SCAN, "$(SCAN=)")
field(FLNK, "$(FLNK=)")
info("pidfile", "$(FILE)")
info("pidpat", "$(PAT=)")
}

63
pidMonApp/pidmon.py Normal file
View File

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
import logging
LOG = logging.getLogger(__name__)
import re, os, errno
from devsup import MAJOR_ALARM, READ_ALARM
class PIDMon(object):
def __init__(self, rec, lnk):
self.fname = rec.info('pidfile')
pat = rec.info('pidpat',None)
if not pat:
pat = '([1-9]+)'
LOG.info('%s: in %s find "%s"', rec.NAME, self.fname, pat)
self.pat = re.compile(pat)
def detach(self, rec):
pass
def allowScan(self, rec):
return False
def process(self, rec, reason=None):
try:
ok, pid = False, None
LOG.debug('Open %s', self.fname)
with open(self.fname, 'r') as F:
for line in map(str.rstrip, F.readlines()):
LOG.debug('Read: %s', line)
M = self.pat.match(line)
if M:
LOG.debug('Match: %s', M.groups())
pid = int(M.group(1))
break
if pid is None:
rec.VAL = 'no PID in PID file'
return
LOG.debug('Testing PID %d', pid)
os.kill(pid, 0) # 0 doesn't signal, but does check for existance
rec.VAL = 'Running'
ok = True
except IOError as e:
if e.errno==errno.ENOENT:
rec.VAL = 'No PID file'
else:
rec.VAL = str(e)
except OSError as e:
if e.errno==errno.ESRCH:
rec.VAL = 'Process not running'
else:
rec.VAL = str(e)
finally:
if not ok:
rec.setSevr(MAJOR_ALARM, READ_ALARM)
build = PIDMon