栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

psutil监测服务状态(多平台)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

psutil监测服务状态(多平台)

根据名称查找进程

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强转再进行比较

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009572.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号