根据名称查找进程
def find_procs_by_name(name):
"Return a list of processes matching 'name'."
ls = []
for p in psutil.process_iter(["name", "exe", "cmdline"]):
if name == p.info['name'] or
p.info['exe'] and os.path.basename(p.info['exe']) == name or
p.info['cmdline'] and p.info['cmdline'][0] == name:
ls.append(p)
return ls
由于Windows中监测Python服务不能直接按照进程名查找服务(统一是python.exe),因此需要先将服务名与pid保存在server.pid文件。再获取监测
根据配置文件中的服务名先匹配
server.pid文件获取非exe文件pid
def get_servpid(pidName):
pid = 0
modeS = 0
try:
f = open(WINDOWS_PID_CONF,'r')
count = len(f.readlines())
print("pid --count:",count,"modeS:",modeS)
f.close()
i = 0
while i < count:
#读取mode+1行
i=i+1
modestr = linecache.getline(WINDOWS_PID_CONF,int(modeS)+i)
if modestr.strip() == "":#如果本行未匹配到数据则继续读取下一行
continue
if modestr.find('=') != -1:
#获取该行key对应的name
str1 = modestr.split("=")#获取存在key-value的行数据
# print("confpidname:",str[0].strip(),"confpidname:",len(str[0].strip()),"pidName:",pidName.strip(),"pidName:",len(pidName))
if str(str1[0].strip()) == str(pidName).strip() : #将key(去除空格)与配置中进行对比
pid = int(str1[1])
print("config pid--->:",pid)
except:
print("get pid error pid = ",pid)
return pid
根据配置文件中的服务名称去监测对应的服务。
读取Role.conf文件,根据mode值对应的key,查找value
def get_servmodemapname():
#获取mode
mode = WINDOWS_MODE
list = []
#在文件中查找mode
modeS = filefindmodeline(mode)
#读取mode+1行
modestr = linecache.getline(WINDOWS_ROLE_CONF,int(modeS)+1)
f = open(WINDOWS_ROLE_CONF,'r')
count = len(f.readlines())
print("count:",count,"modeS:",modeS)
f.close()
i = 0
while i< count - modeS -2:
#读取mode+1行
i=i+1
modestr = linecache.getline(WINDOWS_ROLE_CONF,int(modeS)+i)
if modestr.find(']') != -1:
break
if modestr.strip() == "":
continue
#查找该行key对应的name
str = modestr.split(":", -1)
servstr= str[3]
srevname, srevname1 = servstr.split("}")
list.append(srevname)
return list
获取进程运行信息,这里采用区分Linux与Windows的方法来做,因为不同的服务在两种系统的表现不太一样,直接由psutil模块监测会出错。(这里逻辑上有些繁琐可以简化)
def get_procinfo(pidName, time_range, ipAddr, mc_pub_time): #serverId
procInfo={}
servList = []
servInfoToDbList = []
status = "unknown"
global g_serv_flag
global g_serv_flag_2
time_cnt = int(time_range)/int(mc_pub_time)
sysTime = int(get_sysTime())
ostype = get_ostype()
if ostype == "Linux":
#根据进程名查找进程ID
try:
ret = pidName.rfind(".py")
if ret != -1:
cmdStr = 'ps -ef | grep -w ' + pidName + ' | grep -v grep'
else:
cmdStr = 'ps -ef | grep -w ./' + pidName + ' | grep -v grep'
except Exception as e:
print( "pidname:%s check error.cmdstr:%s" %(pidName, cmdStr))
p = os.popen(cmdStr)
x = p.read()
if x == "" or x == " " or x.isspace() != False:
g_serv_flag = g_serv_flag + 1
print( "procTimeAbnomalFunc -1- g_serv_flag:%d, time_cnt:%d" % (g_serv_flag, time_cnt))
if g_serv_flag > time_cnt:
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
g_serv_flag = 0
print( "-1-ABNOMAL")
else:
abnmTime = int(get_sysTime())
srevStatus = 2
servName = "'" + pidName + "'"
servList = [srevStatus, servName]
servInfoToDbList.append(servList)
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
p.close()
return procInfo
str = re.split('W+', x)
if str[1] != " " and str[1] != "" and str[1].isspace() == False:
pidtmp = str[1]
try:
ptmp = psutil.Process(int(pidtmp))
print( "pidName:%s" % (pidName))
except Exception as e:
print( "get proc info ptmp.name error")
#该命令有时会报错,但服务正常
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
p.close()
return procInfo
if ptmp.name() == pidName or ptmp.name() != "":
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
g_serv_flag_2 = 0
else:
g_serv_flag_2 = g_serv_flag_2 +1
if g_serv_flag_2 > time_cnt:
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
g_serv_flag_2 = 0
print( "-2-ABNOMAL")
else:
abnmTime = int(get_sysTime())
srevStatus = 2
servName = pidName
servList = [srevStatus, servName]
servInfoToDbList.append(servList)
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
p.close()
else:
try:
pidtmp = get_servpid(pidName)
if(pidtmp != 0):
#直接在此根据pid获取服务状态退出函数
print( "--------form conf pid%d get state----------" %pidtmp)
try:
ptmp = psutil.Process(int(pidtmp))
print( "pidName:%s, status=%s" % (pidName, ptmp.status()))
except Exception as e:
print( "get proc info ptmp.name error")
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
return procInfo
if ptmp.status() == "running":
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
else:
if g_serv_flag_2 == 1:
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
g_serv_flag_2 = 0
else:
abnmTime = int(get_sysTime())
srevStatus = 2
servName = "'" + pidName + "'"
servList = [srevStatus, servName]
servInfoToDbList.append(servList)
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
else:
print("===========================")
cmdStr = 'wmic process where caption="'+pidName+'" get processid,commandline'
p = os.popen(cmdStr)
x = p.read()
if x == "" or x == " " or x.isspace() != False:
g_serv_flag = g_serv_flag + 1
print( "procTimeAbnomalFunc -1- g_serv_flag:%d, time_cnt:%d" % (g_serv_flag, time_cnt))
if g_serv_flag > time_cnt:
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
g_serv_flag = 0
#print( "-1-ABNOMAL")
else:
abnmTime = int(get_sysTime())
srevStatus = 2
servName = pidName
servList = [srevStatus, servName]
servInfoToDbList.append(servList)
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
p.close()
return procInfo
str = re.split('W+', x)
# print("-------------------str",x)
if str[-2] != " " and str[-2] != "" and str[-2].isspace() == False:
pidtmp = str[-2]
try:
ptmp = psutil.Process(int(pidtmp))
print( "pidName:%s, status=%s" % (pidName, ptmp.status()))
except Exception as e:
print( "get proc info ptmp.name error")
#该命令有时会报错,但服务正常
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
p.close()
return procInfo
if ptmp.status() == "running":
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
else:
#print( "procTimeAbnomalFunc -2- g_serv_flag_2:%d" % (g_serv_flag_2))
if g_serv_flag_2 == 1:
procInfo['srevStatus'] = "ABNOMAL"
procInfo['time'] = int(time.time())
g_serv_flag_2 = 0
#print( "-2-ABNOMAL")
else:
abnmTime = int(get_sysTime())
srevStatus = 2
servName = "'" + pidName + "'"
servList = [srevStatus, servName]
servInfoToDbList.append(servList)
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
p.close()
except Exception as e:
procInfo['srevStatus'] = "NOMAL"
procInfo['time'] = int(time.time())
print( "get proc info list error")
print( "procinfo:", procInfo)
return procInfo
获取进程运行状态
def procInfoThreadFunc(time_range, q_ip, mc_pub_time):
servicesInfoList = []
servicesList = []
ostype = get_ostype()
#读取配置文件
try:
stype = get_servmodemapname()
print("start name:",stype)
for i in range(len(stype)):
# servtype = json.loads(stype[i])
servtype = eval(stype[i])
"""
获取各服务运行状态
"""
itemList = []
servName = get_procinfo(servtype, time_range, q_ip, mc_pub_time)#获取进程信息
if servName == {} or servName == None:
print( "servName null")
continue
if servName != "":
if servName['srevStatus'] == "NOMAL":
servStatus = 1
servName = servtype
else:
servStatus = 2
servName = servtype
itemList.append(servStatus)
itemList.append(servName)
servicesList.append(itemList)
except Exception as e:
print( "get proc info error")
print("servicesList:%s" % (servicesList))
if ostype != "Linux":
servicesInfoList = servicesList
else:
servicesInfoList = servicesList
return servicesInfoList
if __name__ == '__main__':
procInfoThreadFunc("10", "127.0.0.1", "6")
//j监测服务配置文件
{
"6":[
{"path":"C:windowsPyDa","name":"WindTerm.exe"},
{"path":"C:windowsPyDa","name":"Registry"},
{"path":"C:windowsPyDa","name":"notepad++.exe"},
{"path":"C:windowsPyDa","name":"python.exe"}
]
}
//部分服务pid文件
netcheck = 36972
nginx = 34868
Registry = 152
错误记录:
直接根据对应的服务名获取pid文件中的id值
这里出现了一个问题在刚开始 str1[0].strip()) == pidName).strip() 比较不成功 可能是由于类型不同导致将去除多余字符的值用str强转再进行比较



