当前位置: 首页 > news >正文

Python编写服务监控程序

这是我服务器上运行了很多服务,用来检测服务是否正常的一个小软件。需要自己打包,这是源码。如有需要也可以下载我已经打包好的文件。

import socket
import tkinter as tk
from tkinter import messagebox
import json
import time
import logging
from datetime import datetime
from colorama import init, Fore
from logging.handlers import TimedRotatingFileHandler
import threading

# 初始化 colorama
init(autoreset=True)

# 配置日志
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# 创建一个 TimedRotatingFileHandler,每天轮换一次日志文件,保留 7 天的备份
handler = TimedRotatingFileHandler(
    filename='service_checker.log',
    when='midnight',  # 每天午夜轮换日志文件
    interval=1,  # 间隔 1 天
    backupCount=7,  # 保留 7 个备份
    encoding='utf-8'  # 指定编码格式为 UTF-8
)

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# 为日志记录器添加处理器
logger.addHandler(handler)


# 自定义日志格式化类
class ColoredFormatter(logging.Formatter):
    def format(self, record):
        # 如果是错误或异常日志,使用红色
        if record.levelno >= logging.ERROR:
            record.msg = Fore.RED + str(record.msg) + Fore.RESET
        # 如果是警告日志,使用黄色
        elif record.levelno == logging.WARNING:
            record.msg = Fore.YELLOW + str(record.msg) + Fore.RESET
        # 如果是信息日志,保持默认颜色
        else:
            record.msg = str(record.msg)
        return super().format(record)


# 为控制台处理器设置自定义格式化
console_handler = logging.StreamHandler()
console_handler.setFormatter(ColoredFormatter())
logger.addHandler(console_handler)

# 创建一个 Tkinter 根窗口,并将其隐藏
root = tk.Tk()
root.withdraw()


def check_service(host, port):
    """
    检查服务是否正常运行
    :param host: 服务的IP地址
    :param port: 服务的端口号
    :return: 服务是否正常运行
    """
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(5)
            result = s.connect_ex((host, port))
            return result == 0
    except Exception as e:
        logger.error(f"检测服务 {host}:{port} 时发生错误: {e}")
        return False


def show_alert(service_name, host, port):
    """
    显示服务异常的提示框
    :param service_name: 服务名称
    :param host: 服务的IP地址
    :param port: 服务的端口号
    """

    def alert():
        messagebox.showwarning("服务异常", f"服务 {service_name} ({host}:{port}) 无法正常连接!")

    # 使用主线程的安全方法来显示提示框
    root.after(0, alert)


def load_services_from_config(config_file):
    """
    从配置文件中加载服务信息
    :param config_file: 配置文件路径
    :return: 服务信息列表
    """
    try:
        with open(config_file, 'r', encoding='utf-8') as file:
            config = json.load(file)
            return config.get("services", [])
    except Exception as e:
        logger.error(f"读取配置文件时发生错误: {e}")
        return []


def main():
    # 加载服务配置
    services = load_services_from_config("services.json")

    if not services:
        logger.error("未加载到任何服务,程序即将退出。")
        return

    logger.info(f"开始持续检测 {len(services)} 项服务,按 Ctrl+C 可终止程序。")

    try:
        while True:
            # 遍历所有服务进行检测
            for service in services:
                host = service["host"]
                port = service["port"]
                name = service["name"]

                if check_service(host, port):
                    logger.info(f"服务 {name} ({host}:{port}) 状态: 正常")
                else:
                    logger.error(f"服务 {name} ({host}:{port}) 状态: 异常")
                    show_alert(name, host, port)

            # 每次检测后等待一段时间(例如5分钟)
            logger.info("完成一次检测,等待下次检测...")
            time.sleep(300)

    except KeyboardInterrupt:
        logger.info("\n用户终止了程序,检测已停止。")


if __name__ == "__main__":
    main()

使用方法

  1. 将上述代码保存为 service_checker.py。
  2. 确保 services.json 配置文件在同一目录下。
  3. 运行脚本后,程序会开始持续检测服务状态,每 5 分钟检测一次。
  4. 如果检测到服务不正常,会弹出提示框提醒用户,但不会阻塞其他服务的检测。
  5. 按下 Ctrl+C 可以终止程序运行。

打包为 .exe 文件

使用 pyinstaller 打包时,确保所有依赖库都被正确包含:

pyinstaller --onefile --hidden-import=colorama --hidden-import=logging.handlers service_checker.py

services.json文件示范(修改或增加、删除按照文件内形式进行修改即可)

{
    "services": [
        {
            "host": "192.168.10.151",
            "port": 8079,
            "name": "官网后端(正式环境)"
        },
        {
            "host": "192.168.10.152",
            "port": 8080,
            "name": "官网web(正式环境)"
        },
        {
            "host": "192.168.10.153",
            "port": 8078,
            "name": "官网后台管理(正式环境)"
        },
        {
            "host": "192.168.10.154",
            "port": 6380,
            "name": "redis"
        },
        {
            "host": "192.168.10.155",
            "port": 8181,
            "name": "日志管理系统"
        }
    ]
}

检测程序端口服务程序下载地址:

点击下载打包完成的程序(访问密码: 2747)

相关文章:

  • Unity Shader编程】之透明物体渲染
  • 第五: redis 安装 / find 查找目录
  • JVM常用概念之身份哈希码
  • Apache SeaTunnel脚本升级及参数调优实战
  • 指令系统(2017统考真题)
  • 人工智能在电子信息工程信号处理中的应用调研
  • 离线黑客攻击之绕过BIOS/EFI
  • openstack安装部署
  • docker-存储卷-网络
  • 游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】
  • 存算分离是否真的有必要?从架构之争到 Doris 实战解析
  • INT202 Complexity of Algroithms 算法的复杂度 Pt.2 Search Algorithm 搜索算法
  • Error: The resource name must start with a letter
  • 代码随想录第55期训练营第七天|LeetCode454.四数相加II、383.赎金信、15.三数之和、18.四数之和
  • 基于javaweb的SSM+Maven宠物领养宠物商城流浪动物管理系统与实现(源码+文档+部署讲解)
  • 【PCIe 总线及设备入门学习专栏 3.2 -- PCIe 在进行大数据搬运时是如何组包的?】
  • 【STM32实物】基于STM32的太阳能充电宝设计
  • Android adb调试应用程序
  • 【时时三省】(C语言基础)习题2 scanf函数
  • 在Springboot中集成unihttp后应用无法启动的解决办法
  • 免费做司考真题的网站/近期国际热点大事件
  • wordpress淘宝客建站/如何进行网络营销
  • 沈阳营销型网站制作/百度搜索引擎平台
  • 开封市城乡建设局网站/外包网站有哪些
  • 惠山网站建设/上海优化价格
  • 唐山海港经济开发区人才网/首页排名优化公司