需求:软件公司提供的软件服务在服务器上会莫名其妙的挂掉,他们采用的方法也只有重启服务器,重启时间太久了,所以想弄一个监测进程和服务的程序,监测到挂了就重启进程或者服务
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].stateelse: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_listdef 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
,然后放到服务器上