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/App"def monitor_service():# 获取所有进程all_processes = psutil.process_iter(attrs=['pid', 'name'])# 检查服务程序是否在运行service_running = any(process.info['name'] == "python.exe"for process in all_processes)if not service_running:# 服务程序不存在,启动新的进程subprocess.Popen(service_command, cwd=service_path, shell=True)print("Service restarted.")# 创建定时任务
scheduler = BlockingScheduler()
scheduler.add_job(monitor_service, 'interval', minutes=5)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下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps,top,free等等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。

在Python中获取系统信息的另一个好办法是使用psutil这个第三方 模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。

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, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
  • 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(logical=False))
# 查看cpu逻辑个数的信息
print("逻辑CPU个数: %s" % psutil.cpu_count(logical=True))
# 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], shell=True)print('启动服务程序:', processe_command[i][0])subprocess.Popen(processe_command[i][0], cwd=processe_command[i][1], shell=True)if __name__ == '__main__':logger.add("MonitorProcess_{time}.log")print('监控程序开始运行!')#monitorprocss()scheduler = BlockingScheduler(timezone=pytz.timezone("Asia/Shanghai") )#scheduler.add_job(monitorprocss, 'cron', minute = '00,10,20,30,40,50', second='00', misfire_grace_time=60, id='job1')scheduler.add_job(monitorprocss, 'interval', minutes = 1, id='job1')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第三方库psutil(process and system utilities)库详解:获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式链路追踪入门篇-基础原理与快速应用

为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…

Comsol Multiphysics 6.2 for Mac建模仿真软件

COMSOL Multiphysics是一款多物理场仿真软件,旨在帮助工程师、科学家和研究人员解决各种复杂的工程和科学问题。该软件使用有限元分析方法,可以模拟和分析多个物理场的相互作用,包括结构力学、热传导、电磁场、流体力学和化学反应等。 COMSOL…

一些好用的前端小插件(转自知乎)

一些好用的前端小插件(2) 1. cropper.js Cropper.js 2.0 是一系列用于图像裁剪的 Web 组件。 官网地址:https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款浏览器端的 Markdown 编辑器,支持所见即所得、…

2024年度投资策略:AI大模型和半导体国产化加速

今天分享的是AI系列深度研究报告:《2024年度投资策略:AI大模型和半导体国产化加速》。 (报告出品方:东方证券) 报告共计:48页 前言: 行情回顾与未来展望 电子板块涨幅转正,信心逐渐回归。截至…

git的使用记录

GitHub是公有的远程仓库,Gitlab是私有的远程仓库。 git add file git commit -m "add file" git mv filea fileb git log 显示提交记录 git log --oneline 一行的简略信息显示 git log --oneline --decorate 显示当前指针 git reset --ha…

矩阵知识补充

正交矩阵 定义: 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质: A的逆等于A的转置,即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1,即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

Vim 一下日志文件,Java 进程没了?

一次端口告警,发现 java 进程被异常杀掉,而根因竟然是因为在问题机器上 vim 查看了 nginx 日志。下面我将从时间维度详细回顾这次排查,希望读者在遇到相似问题时有些许启发。 时间线 15:19 收到端口异常 odin 告警。 状态:P1故障 名称:应用端…

黑马点评笔记 redis实现优惠卷秒杀

文章目录 难题全局唯一IDRedis实现全局唯一Id 超卖问题问题解决方案乐观锁问题 一人一单 难题 要解决优惠卷秒杀的问题我们要考虑到三个个问题,全局唯一ID,超卖问题,一人一单。 全局唯一ID 用户抢购时,就会生成订单并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替换成本地下载编译安装解决网络超时问题

目录 🌑🌑 背景 🌒 🌒作用 🌔🌔 问题 🌔🌔解决方案 🌙方法一 🌙方法二 🌝🌝我的解决方案 整理不易,欢迎一键三连…

分布式篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是补偿事务?二、消息队列是怎么实现的?三、那你说说Sagas事务模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

qgis添加postgis数据

左侧浏览器-PostGIS-右键-新建连接 展开-双击即可呈现 可以点击编辑按钮对矢量数据编辑后是直接入库的,因此谨慎使用。

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中,数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式,以提升效率、增强竞争力和创造新的增长机会。 提升运营效率:数字化转型通过引入自动化工具和智能系统&#x…

NX二次开发UF_CSYS_ask_wcs 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

JMeter压测常见面试问题

1、JMeter可以模拟哪些类型的负载? JMeter可以模拟各种类型的负载,包括但不限于Web应用程序、API、数据库、FTP、SMTP、JMS、SOAP / RESTful Web服务等。这使得JMeter成为一个功能强大且灵活的压力测试工具。 2、如何配置JMeter来进行分布式压力测试&a…

在华为昇腾开发板安装gdal-python

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 在华为昇腾开发板安装gdal-python分为两步:编译gdal库和下载gdal对应的python包。 1.编译gdal库 首先下载gdal库,。在linux(arm架构)上编译的gdal库及其第三方库源码,内含一个编译…

智慧法院 | RPA+AI打造智慧执行助手,解决“案多人少”现实难题

为深化政法智能化建设,加强“智慧治理”“智慧法院”“智慧检务”“智慧警务”“智慧司法”等信息平台建设,深入实施大数据战略,实现科技创新成果同政法工作深度融合。法制日报社于今年3月继续举办了2023政法智能化建设创新案例及论文征集宣传…

Unity UGUI的HorizontalLayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件? HorizontalLayoutGroup是Unity UGUI中的一种布局组件,用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小,使它…

Navicat 技术指引 | GaussDB服务器对象的创建/设计(编辑)

Navicat Premium(16.2.8 Windows版或以上) 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

卷积神经网络(AlexNet)鸟类识别

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、AlexNet (8层)介绍四、构建AlexNet (8层)网络模型五、…