北京南站停车场收费标准,深圳外贸电商网站建设,四川二级站seo整站优化排名,点拓网站建设1. 需求概述
当我们在Windows Server环境中部署XX系统的实际应用中#xff0c;往往会遇到一些运维管理的挑战。为了确保系统的持续稳定运行#xff0c;特别是在服务程序因各种原因突然关闭的情况下#xff0c;我们可以借助Python的强大生态系统来构建一个监控与自动重启的管…1. 需求概述
当我们在Windows Server环境中部署XX系统的实际应用中往往会遇到一些运维管理的挑战。为了确保系统的持续稳定运行特别是在服务程序因各种原因突然关闭的情况下我们可以借助Python的强大生态系统来构建一个监控与自动重启的管理工具。
在这个场景中我使用了psutil第三方库它提供了跨平台的系统进程和系统利用率信息。结合apscheduler用于定时任务的管理以及subprocess用于启动和监控服务程序我打造了一个简单而有效的监控系统。
首先我使用psutil来获取并筛选出系统中我们所关心的服务程序的进程。通过定时任务我定期检查该进程是否在运行如果不存在那么就启动一个新的进程确保服务不会因意外关闭而中断。
下面是一个简单的Python代码示例演示了如何使用这些库来实现监控与自动重启
import psutil
import subprocess
from apscheduler.schedulers.blocking import BlockingScheduler# 设置服务程序的命令和路径
service_command py_monitor TestMonitor.py
service_path D:/03study/Test/Appdef monitor_service():# 获取所有进程all_processes psutil.process_iter(attrs[pid, name])# 检查服务程序是否在运行service_running any(process.info[name] python.exefor process in all_processes)if not service_running:# 服务程序不存在启动新的进程subprocess.Popen(service_command, cwdservice_path, shellTrue)print(Service restarted.)# 创建定时任务
scheduler BlockingScheduler()
scheduler.add_job(monitor_service, interval, minutes5)try:print(Monitoring and auto-restarting service...)scheduler.start()
except KeyboardInterrupt:# 用户手动终止任务pass注此代码参考自chatgpt在windows平台上有些权限限制process.cmdline()报错去掉。 请注意这只是一个简单的示例实际中你可能需要根据具体情况进行更复杂的异常处理、日志记录等。此外确保你的系统允许定时任务的执行例如在Linux中可以使用cron等工具。
2. python监控技术
2.1. Python在系统监控中的应用
系统监控是保证计算机系统正常运转的基础也是运维工作的核心之一。Python在系统监控中的应用非常广泛例如
监控进程和系统资源Python可以通过内置的psutil模块来监控运行中的进程以及系统资源的使用情况如CPU、内存、磁盘等。监控网络流量Python可以通过scapy等第三方库来监控网络流量、分析流量内容、抓包等有时还可以用来检测网络攻击。自定义监控Python可以通过自定义实现各种监控项如监控服务、网站、日志等自定义监控项可以更贴合具体业务需求。例如可以通过发送ping包来检测服务器是否能够正常响应。报警处理Python可以将监控数据通过邮件、短信等方式发送给管理员一旦监控数据异常可以及时触发报警机制。这些报警机制可以在Python中用一些库来实现如smtplib、email、twilio等。
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下有许多系统命令可以让我们时刻监控系统运行的状态如pstopfree等等。要获取这些系统信息Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦尤其是要写很多解析代码。
在Python中获取系统信息的另一个好办法是使用psutil这个第三方 模块。顾名思义psutil process and system utilities它不仅可以通过一两行代码实现系统监控还可以跨平台使用支持LinuxUNIXOSXWindows等是系统管理员和运维小伙伴不可或缺的必备模块。
2.2. psutil
psutil是一个跨平台库能够轻松实现获取系统运行的进程和系统运行的信息包括CPU、内存、磁盘、网络等。它主要用来做系统监控性能分析进程管理。它实现了同等命令行工具提供的功能如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
2.3. 任务调度与启动服务程序
2.3.1 APScheduler
APScheduler是一个用于任务调度和定时任务管理的Python库。它提供了一个简单而灵活的方式来定义、调度和执行任务。
2.3.2. subprocess 模块
subprocess 模块允许我们启动一个新进程并连接到它们的输入/输出/错误管道从而获取返回值。
subprocess 模块首先推荐使用的是它的 run 方法更高级的用法可以直接使用 Popen 接口。
run 方法语法格式如下 subprocess.run(args, *, stdinNone, inputNone, stdoutNone, stderrNone, capture_outputFalse, shellFalse, cwdNone, timeoutNone, checkFalse, encodingNone, errorsNone, textNone, envNone, universal_newlinesNone)args表示要执行的命令。必须是一个字符串字符串参数列表。stdin、stdout 和 stderr子进程的标准输入、输出和错误。timeout设置命令超时时间。如果命令执行时间超时子进程将被杀死并弹出 TimeoutExpired 异常。check如果该参数设置为 True并且进程退出状态码不是 0则弹 出 CalledProcessError 异常。encoding: 如果指定了该参数则 stdin、stdout 和 stderr 可以接收字符串数据并以该编码方式编码。否则只接收 bytes 类型的数据。shell如果该参数为 True将通过操作系统的 shell 执行指定的命令。returncode: 执行完子进程状态通常返回状态为0则表明它已经运行完毕若值为负值 “-N”,表明子进程被终。
3. 实践过程
3.1. psutil库的安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple psutil
3.2. 常用方法
3.2.1. 获取系统信息示例
# coding:utf-8
import psutil
import datetime
import timenow_time time.strftime(%Y-%m-%d-%H:%M:%S, time.localtime(time.time()))
print(当前时间, now_time)
# 获取系统启动时间
print(系统启动时间: %s % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(%Y-%m-%d %H:%M:%S))print(----------------------------系统CPU信息---------------------------------------)
# 查看cpu物理个数的信息
print(物理CPU个数: %s % psutil.cpu_count(logicalFalse))
# 查看cpu逻辑个数的信息
print(逻辑CPU个数: %s % psutil.cpu_count(logicalTrue))
# cpu的使用率
cpu (str(psutil.cpu_percent(1))) %
print(当前1s内系统cup使用率: %s % cpu)print(----------------------------系统内存信息---------------------------------------)
# 查看内存信息
total str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
free str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
used str(round(psutil.virtual_memory().used / (1024.0 * 1024.0 * 1024.0), 2))
memory int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print(物理总内存 %s G % total)
print(已使用物理内存 %s G % used)
print(剩余物理内存 %s G % free)
print(物理内存使用率 %s %% % int(memory * 100))print(----------------------------系统用户信息---------------------------------------)
# 获取系统用户
users_count len(psutil.users())
users_list , .join([u.name for u in psutil.users()])
print(当前有 %s 个用户分别是 %s % (users_count, users_list))print(----------------------------系统网卡信息---------------------------------------)
# 获取网卡信息可以得到得到网卡属性连接数当前数据等信息
net psutil.net_io_counters()
bytes_sent {0:.2f} Mb.format(net.bytes_recv / 1024 / 1024)
bytes_recv {0:.2f} Mb.format(net.bytes_sent / 1024 / 1024)
print(网卡接收数据 %s 网卡发送数据 %s % (bytes_recv, bytes_sent))print(-----------------------------系统磁盘信息---------------------------------------)
# 获取磁盘数据信息
io psutil.disk_partitions()
print(系统当前所有的磁盘信息{}.format(io))
for i in io:try:o psutil.disk_usage(i.device)print(磁盘名{}.format(i.device), end\t)print(总容量 str(int(o.total / (1024.0 * 1024.0 * 1024.0))) G, end\t)print(已用容量 str(int(o.used / (1024.0 * 1024.0 * 1024.0))) G, end\t)print(可用容量 str(int(o.free / (1024.0 * 1024.0 * 1024.0))) G)except PermissionError:continueprint(-----------------------------系统进程信息-------------------------------------)
# 查看系统全部进程
for pid in psutil.pids():p psutil.Process(pid)print(进程名 %-20s 内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s % (p.name(), p.memory_percent(), p.status(), p.create_time()))
输出结果截取片段 3.2.2. 获取网络信息
获取主机名与IP地址
import socket
hostname socket.gethostname()
print(hostname)
print(socket.gethostbyname(hostname))3.3. 应用实践
import psutil
import time
import subprocessimport pytz
from apscheduler.schedulers.blocking import BlockingScheduler
from loguru import logger# 按进程名称查询进行
def find_procs_by_name(name):#Return a list of processes matching name.ls []for p in psutil.process_iter([name]):if p.info[name] name:ls.append(p)return ls# 监控进程列表
def monitorprocss():processname [ pvforecast_py.exe,pvweather24_py.exe]cmdbat [D:\Python\PVMicrogrid\PVSystem\PVForecastAPScheduler.bat,D:\Python\PVMicrogrid\PVSystem\PVAPScheduler.bat]processe_command [(start processname[0] PVForecastAPScheduler.py,D:\Python\PVMicrogrid\PVSystem ),(start processname[1] PVAPScheduler.py,D:\Python\PVMicrogrid\PVSystem),(start processname[2] PVTrainAPScheduler.py,D:\Python\PVMicrogrid\PVSystem)]for i in range(len(processname)):ls find_procs_by_name(processname[i])if len(ls)0:p ls[0]# 获取进程创建时间createtime time.strftime(%Y-%m-%d %X, time.localtime(p.create_time())) #print(进程创建时间, createtime) if p.is_running():# 获取该进程的内存利用率rate p.memory_percent() logger.info(processname[i] 该进程的内存利用率 str(round(rate,2)))else:# 杀掉进程p.terminate()logger.info(processname[i] 进程创建时间 createtime) else:# 重新启动进行# 运行批处理文件并获取返回值#result subprocess.run(cmdbat[i], shellTrue)print(启动服务程序, processe_command[i][0])subprocess.Popen(processe_command[i][0], cwdprocesse_command[i][1], shellTrue)if __name__ __main__:logger.add(MonitorProcess_{time}.log)print(监控程序开始运行)#monitorprocss()scheduler BlockingScheduler(timezonepytz.timezone(Asia/Shanghai) )#scheduler.add_job(monitorprocss, cron, minute 00,10,20,30,40,50, second00, misfire_grace_time60, idjob1)scheduler.add_job(monitorprocss, interval, minutes 1, idjob1)try:scheduler.start()except (KeyboardInterrupt, SystemExit):pass 4. 总结
使用python开发系统监控工具能快速实现个性化需求短小而且精悍。其中服务程序自启动功能可以替代“Windows环境中Python应用服务自启动及其监控解决方法“所描述多个启动批处理文件直接使用此一个批处理文件”MonitorProcess.bat“可以完全胜任。
echo off
D:
cd D:\Python\PVMicrogrid\utils
start python Monitorprocess.py
部署代码buildw.bat修改为
chcp 65001copy D:\Python\PVMicrogrid\MonitorProcess.bat %userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\MonitorProcess.bat 注意需要把…\Startup\MonitorProcess.bat文件加入安全防护白名单中。 通过这样的监控与自动重启工具我们可以更好地保障应用服务系统的稳定性及时应对各种潜在问题确保服务始终处于可用状态。
参考
肖永威. Windows环境中Python应用服务自启动及其监控解决方法. CSDN博客. 2023.11 习久性成. python第三方库psutilprocess and system utilities库详解获取系统运行的进程和系统利用率包括CPU、内存、磁盘、网络等信息