(GUI)Python课程设计:使用PyQt5实现服务器监控

Python 服务器监控

完整项目:sysOr · Hardman233/MyStudentBase - 码云 - 开源中国 (gitee.com)

程序安装包:链接:https://pan.baidu.com/s/1DmbzKZ2u1yRjVTDzm2G28w
提取码:yq0i

该项目使用PyQt5 QtDesigner Paramiko Loguru技术实现了一个简易的服务器监控器

本项目实现了获取部分服务器信息,用于简单的Linux服务器监控。
该项目很多代码可以进一步重构,由于太懒就没有重构,支持有需要的同学修改和进一步完善。
该项目只用于学习使用,转载请标明出处,如有错误请指正,微信:kc1124442970。

环境安装

paramiko       安装:pip install paramiko
PyQt5          安装:pip install pyqt5
pyqt5-tools    安装:pip install pyqt5-tools
loguru		   安装:pip install loguru
pyinstaller	   安装:pip install pyinstaller  ## 用于把程序打包成exe文件

文件结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQpgQ0rV-1681350920508)(C:\Users\孔晨\AppData\Roaming\Typora\typora-user-images\image-20230413085624946.png)]

com包下封装了一些常用的对服务器操作的类及其方法

./SSHConCore.py    该类下实现了SSH连接,但只作为一个接口文件是所有类的爹类~,方便阅读
./UseCOMMAND.py    该类继承了SSHConCore,用于使用Python代码去输入Linux命令操作其系统
./Linux            该包下存放了获取Linux系统信息的常用类
./Linux/AcquireLinSymInfo.py    该类继承了UseCOMMAND,用于获取CPU 磁盘 内存 负载均衡的所有信息
./Linux/CPUMsg.py               该类继承了AcquireLinSymInfo,用于获取常用CPU信息并做了人性化处理(类中的方法有注释)
./Linux/DiskSpaceMsg.py			该类继承了AcquireLinSymInfo,用于获取常用磁盘信息(暂未实现,部分实现代码在UiMain中)
./Linux/LoadMsg.py			    该类继承了AcquireLinSymInfo,用于获取负载均衡常用信息并做了人性化处理(类中的方法有注释)
./Linux/MemoryMsg.py			该类继承了AcquireLinSymInfo,用于获取内存常用信息并做了人性化处理(类中的方法有注释)
./test             该包只用于存放开发时测试文件(gitee上传的项目中已经删除)
./UiMain           该包存放了桌面应用的Python代码和以构建好的exe文件
./UiMain/build  				该文件夹下存放了构建exe时生成的文件
./UiMain/dist					该文件夹下存放了构建的exe文件(若想启动exe文件则需要把exe文件移动到./UiMain下)
./UiMain/logs					该文件夹下存放了一些程序运行时生成的日志文件
./UiMain/static					该文件夹下存放了一下静态资源(目前不用)
./UiMain/EnterUiMain.py			该类为整个程序的GUI入口,如启动本程序则启动该文件即可
./UiMain/EnterUiMain.spec		该文件是程序打包后生成的配置文件,下次再次打包该项目只需在该文件中配置即可
./UiMain/UiMain.ui				该文件是Qt Designer到处的ui文件,就类似web前端的静态页面
./UiMain/4417102_desktop_pc_server_icon.ico    该文件为程序的图标文件

项目结构(类图)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IM6WeRdn-1681350920509)(Python 服务器监控.assets/Server.png)]

项目部分文件源码说明

1. SSHConCore.py

该文件为整个SSH连接的核心类,其中定义了连接Linux服务器的核心信息和四个模块的接口,例如:第一次连接选择Yes or No、公网IP、用户名密码等

import paramiko


class SSHConByPy:
    def __init__(self, hostname, port, name, password):
        # 全部属性
        self.all_message = dict()
        # 获取实例
        self.client = paramiko.SSHClient()
        # 加上这句话不用担心选yes的问题,会自动选上(用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes)
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 连接
        self.client.connect(hostname, port, name, password)

    # 关闭连接
    def close_connect(self):
        if self.client is not None:
            self.client.close()

	# 获取四个模块信息接口
    def get_loadBalance(self):
        pass

    def get_allRAMemory(self):
        pass

    def get_allCPUInformation(self):
        pass

    def get_diskSpace(self):
        pass

2. UseCOMMAND.py

该文件封装了两种使用Linux命令的方法

from com.SSHConCore import SSHConByPy


class UseCOMMAND(SSHConByPy):
    def __init__(self, hostname, port, name, password):
        # 调用父类的构造器
        super(UseCOMMAND, self).__init__(hostname, port, name, password)

    # 输入一个命令,返回一个列表
    def get_message_line(self, shell_command):
        stdin, stdout, stderr = self.client.exec_command(shell_command)
        # 输出返回信息
        stdout_info_line = stdout.readlines()
        return stdout_info_line

    # 返回字符串
    def get_message(self, shell_command):
        stdin, stdout, stderr = self.client.exec_command(shell_command)
        # 输出返回信息
        stdout_info_str = stdout.read().decode('utf8')
        return stdout_info_str

3. AcquireLinSymInfo.py

该文件获取实现了UseCOMMAND.py的四个模块接口,获取服务器中四个模块的所有信息。该文件相当于简单处理了每个模块的所有信息,供后面细分的子类调用做更细致的处理

from com.UseCOMMAND import UseCOMMAND


class AcquireLinSymInfo(UseCOMMAND):
    def __init__(self, hostname, port, name, password):
        # 调用父类的构造器
        super(AcquireLinSymInfo, self).__init__(hostname, port, name, password)

    # 获取全部内存信息
    def get_allRAMemory(self):
        mem_stdout_info = self.get_message_line("cat /proc/meminfo")
        memory_dic = {}
        for line in mem_stdout_info:
            # 去除多余的冒号,并且把他们分割
            ls_line = line.replace(":", "").split()
            memory_dic[ls_line[0]] = round(float(ls_line[1]) / 1024, 2)
        return memory_dic

    # 获取CPU的全部信息
    def get_allCPUInformation(self):
        cpu_stdout_info = self.get_message_line('cat /proc/cpuinfo')
        cpu_dic = {}
        for line in cpu_stdout_info:
            # 用冒号分割,去除多余的\n
            ls_line = line.strip('\n').split(':')
            # 去除第一个值的\t
            ls_line[0] = ls_line[0].strip('\t')
            # 由于上一步的处理 在获取key值的时候发现 有列表只有一个元素 且为 ''  故判断  否则会报错:列表下标溢出
            if ls_line[0] != '':
                cpu_dic[ls_line[0]] = ls_line[1]
        return cpu_dic

    # 负载均衡
    def get_loadBalance(self):
        loadBalance_stdout_info = self.get_message_line('cat /proc/loadavg')[0].split()
        loadBalance_dic = {'bef_5min_loadavgs': loadBalance_stdout_info[0],
                           'bef_10min_loadavgs': loadBalance_stdout_info[1],
                           'bef_15min_loadavgs': loadBalance_stdout_info[2],
                           'usingThread_and_totalThread': loadBalance_stdout_info[3],
                           'recently_usingThread_id': loadBalance_stdout_info[4]
                           }
        return loadBalance_dic

    # 获取磁盘空间使用量
    def get_diskSpace(self):
        pass

4. Linux包下的所有文件

除了AcquireLinSymInfo.py外,其他为细分四个模块的文件,结构较为简单

程序打包

使用pyinstaller工具打包

由于不同机器的环境都不同,打包时遇到的坑也都不一样,请自行百度如何打包

附上参考链接:(57条消息) 【Python教程】保姆版教使用Pyinstaller 打包python成exe文件_王同学在这的博客-CSDN博客

exe打包成安装包

使用Inno Setup 编译器,由于较为简单,在这里就不具体说明,可自行百度

附上参考链接:(57条消息) 如何将已经安装好的软件打包成安装包_Inno setup 打包教程(转载)_weixin_39575565的博客-CSDN博客

程序安装

1. 打开安装包

在这里插入图片描述

2. 安装

在这里插入图片描述

在这里插入图片描述

3. 等待安装完毕

4. 桌面图标

在这里插入图片描述

程序使用说明

  • 登录前,退出按钮 被禁用
  • 登录成功后,登录按钮 被禁用,退出按钮 启用,IP输入框 用户名输入框 密码输入框 被设为只读
  • 退出成功后,退出按钮 被禁用,登录按钮 启用,IP输入框 用户名输入框 密码输入框 被设为可修改
  • 如果未登录成功,则不会禁用登录按钮 此时需要用户查看日志,如遇见bug请及时反馈(联系方式在程序右下方)
  • 如果未退出成功,则不会禁用退出按钮 此时需要用户查看日志,如遇见bug请及时反馈

程序实现效果

1. 登录前

在这里插入图片描述

2. 登录时(登录成功)

在这里插入图片描述

3. 登录后退出

在这里插入图片描述

4. 登录失败,查看日志

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要让 Python 代码在服务器上永久运行,可以使用一些方法来实现守护进程或后台运行。下面是几种常见的方法: 1. 使用 nohup 命令:可以使用 `nohup` 命令来运行 Python 脚本,并将输出重定向到一个日志文件,这样即使关闭终端或断开 SSH 连接,脚本仍然会继续在后台运行。 ```bash nohup python your_script.py > output.log & ``` 其中,`your_script.py` 是你的 Python 脚本,`output.log` 是输出日志的文件名。 2. 使用 systemd 或 init.d:对于 Linux 系统,你可以将 Python 脚本配置为一个系统服务,使用 systemd(在较新的发行版上)或 init.d(在旧的发行版上)来管理和启动脚本。这样脚本会在系统启动时自动运行,并能够随时监控和管理。 配置 systemd 服务示例: - 创建一个名为 `your_script.service` 的服务文件,内容如下: ``` [Unit] Description=Your Python Script After=network.target [Service] ExecStart=/usr/bin/python /path/to/your_script.py WorkingDirectory=/path/to/script_directory [Install] WantedBy=multi-user.target ``` - 将服务文件复制到 `/etc/systemd/system/` 目录下,并执行以下命令启动服务: ```bash sudo systemctl start your_script ``` 你还可以使用 `systemctl` 命令来停止、重启和查看服务状态。 3. 使用守护进程管理工具:还可以使用一些专门的守护进程管理工具,如 Supervisor 或 PM2。这些工具可以帮助你管理和监控 Python 脚本的运行,并提供了更多的配置选项和功能。 - 使用 Supervisor:安装 Supervisor,并创建一个配置文件,指定要运行的 Python 脚本和日志文件路径。然后启动 Supervisor,它将会监控并管理脚本的运行。 - 使用 PM2:安装 PM2,并使用 `pm2 start` 命令来启动 Python 脚本。PM2 提供了许多额外的功能,如日志管理、自动重启等。 以上方法中的每一种都有其适用的场景和配置选项。你可以根据自己的需求选择合适的方法来让 Python 代码在服务器上永久运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔表表uuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值