需求:软件公司提供的软件服务在服务器上会莫名其妙的挂掉,他们采用的方法也只有重启服务器,重启时间太久了,所以想弄一个监测进程和服务的程序,监测到挂了就重启进程或者服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import psutil import time import subprocess import logging import logging.handlers import wmi import ctypes import os # 获取服务状态 def get_service_status(service_names): wmiobj = wmi.WMI() for service_name in service_names: services = wmiobj.Win32_Service(Name = service_name) if services: # 服务状态是停止就开启服务 if services[ 0 ].state = = "Stopped" : start_service(service_name) # return services[0].state else : logging.error(f "失败:服务{service_name}不存在" ) #判断是否有管理员权限 def is_admin(): try : return ctypes.windll.shell32.IsUserAnAdmin() except : return False # 启动服务 def start_service(service_name): if is_admin(): try : cmd = 'NET START {}' . format (service_name) os.popen(cmd) logging.warning(f "成功:启动了服务{service_name}" ) except Exception as e: logging.error(f "失败:启动服务{service_name}失败, 错误信息: {e}" ) else : logging.warning(f "不是admin权限" ) # 日志配置 def loggingstars(): logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() logger.addHandler(handler) file_handler = logging.handlers.RotatingFileHandler(filename = 'process_name.log' , maxBytes = 1024 * 1024 * 90 , backupCount = 10 ) file_handler.setLevel(logging.WARNING) formatter = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 获取掉线的进程完整执行路径 def find_process_by_name(process_names): all__process = set () """获取所有进程的完成路径""" for proc in psutil.process_iter([ 'pid' , 'name' , 'exe' ]): all__process.add(proc.info[ 'exe' ]) """ 找出掉线的监控进程的完整路径 """ new_list = [item for item in process_names if item not in all__process] return new_list def start_process(process_names, service_anmes): while True : # 检查服务是否启动 get_service_status(service_anmes) time.sleep( 60 ) stop_process = find_process_by_name(process_names) if not stop_process: continue """ 启动掉线的进程 """ for app in stop_process: try : subprocess.Popen(f "{app}" ) logging.warning(f "成功:启动了进程{app}" ) except Exception as e: logging.error(f "失败:启动进程{app}失败, 错误信息: {e}" ) # 如果需要启动进程的话,暂停20分钟 time.sleep( 20 * 60 ) if __name__ = = "__main__" : loggingstars() logging.warning( "============== 进程监控程序启动 ============" ) # 需要监测的进程,为什么使用可执行文件,是因为发现有进程名会相同 process_names = [ "C:\UserApp\app\baidu-translate-client\百度翻译.exe" , "C:\UserApp\app\dingding\main\current\DingTalk.exe" ] # 需要监测的服务名 service_anmes = [ "MySQL80" , "JetBrainsEtwHost" ] start_process(process_names, service_anmes) |
其实服务也是启动执行文件然后有一个进程,如果找到所有服务的进程直接写进程监控就可以了,这里只是展示一下怎么监控服务和进程
有些服务或者进程的启动可能有顺序
- 打开 运行 输入 “msinfo32”
- 选择 “软件环境” 再点击 “正在运行任务”就可疑查看启动时间
打包就用 Pyinstaller -F xx.py,然后放到服务器上
到此这篇关于python监控windows服务器的进程和服务的文章就介绍到这了,更多相关python监控服务器进程和服务内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!