找回密码
 会员注册
查看: 22|回复: 0

Python高级技巧:利用psutil和subprocess实现程序监控与管理

[复制链接]

7

主题

0

回帖

22

积分

新手上路

积分
22
发表于 2024-9-10 06:06:07 | 显示全部楼层 |阅读模式
1.简介在关键的应用程序中,监听程序的运行状态十分重要,因为其可以确保程序的平稳运行。本文将介绍如何使用Python实现这一功能,这里主要使用psutil和subprocess模块。同时,最后会提供一个完整的脚本案例供参考,用于监控并在目标程序意外停止时重启程序。2.subprocess模块介绍subprocess模块是Python中用于创建和管理子进程的标准库模块。它允许你执行系统命令或其他可执行文件,获取它们的输出,以及与其交互。下面是一些subprocess模块的基本用法和示例:1.运行外部命令你可以使用subprocess.run()函数来运行外部命令,并等待其完成:importsubprocess#运行一个简单的命令result=subprocess.run(['ls','-l'],capture_output=True,text=True)#打印命令输出print(result.stdout)1234567['ls','-l']是一个示例命令,它列出当前目录的详细文件信息。capture_output=True表示捕获命令的标准输出和标准错误输出。text=True表示输出以文本字符串的形式返回,而不是字节。2.后台执行命令如果你希望命令在后台执行而不阻塞当前进程,可以使用subprocess.Popen类:importsubprocess#后台执行命令process=subprocess.Popen(['python','target.py'])#等待命令完成process.wait()12345673.获取命令输出如果需要获取命令的输出,可以使用subprocess.check_output()函数:importsubprocess#获取命令输出output=subprocess.check_output(['echo','Hello,subprocess!'],text=True)#打印输出print(output)12345674.传递输入给命令有时候需要将数据传递给命令的标准输入。可以使用subprocess.Popen.communicate()方法来实现:importsubprocess#启动命令并传递输入process=subprocess.Popen(['grep','Python'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,text=True)#向命令输入数据output,_=process.communicate('Pythonisawesome!')#打印命令输出print(output)123456789105.处理命令返回值通过subprocess.run()或subprocess.Popen.wait()可以获取命令的返回值,通常是命令的退出代码。这可以帮助你判断命令是否成功执行。3.psutil模块介绍psutil(PythonSystemandProcessUtilities)模块是一个跨平台的库,提供了方便的接口来获取系统信息和管理进程。它可以用于监控系统资源的使用情况、管理进程以及执行系统管理任务。以下是psutil模块的一些主要功能和使用示例:1.安装psutil首先确保你已经安装了psutil模块。如果没有安装,可以通过pip安装:pipinstallpsutil12.获取系统信息使用psutil可以轻松地获取系统的各种信息,如CPU使用率、内存使用情况、磁盘分区信息等。importpsutil#获取CPU逻辑核心数cpu_count=psutil.cpu_count(logical=True)print(f"CPU逻辑核心数:{cpu_count}")#获取内存使用情况memory=psutil.virtual_memory()print(f"总内存:{memory.total/1024/1024}MB")print(f"已使用内存:{memory.used/1024/1024}MB")#获取磁盘分区信息disk_partitions=psutil.disk_partitions()forpartitionindisk_partitions:print(f"分区设备:{partition.device},文件系统:{partition.fstype}")1234567891011121314153.获取进程信息psutil可以用来获取系统中运行的进程信息,包括进程列表、CPU使用率、内存使用情况等。importpsutil#获取所有进程列表all_processes=list(psutil.process_iter())forprocinall_processes[:5]:#打印前五个进程print(f"进程名:{proc.name()},PID:{proc.pid}")#获取指定PID进程的详细信息pid=1234#替换成你要查看的进程PIDifpsutil.pid_exists(pid):process=psutil.Process(pid)print(f"进程名称:{process.name()}")print(f"进程状态:{process.status()}")print(f"进程创建时间:{process.create_time()}")print(f"进程CPU使用率:{process.cpu_percent(interval=1)}%")print(f"进程内存使用情况:{process.memory_info().rss/1024/1024}MB")else:print(f"PID{pid}对应的进程不存在。")1234567891011121314151617184.进程管理操作psutil还允许对进程进行管理操作,如终止进程、发送信号等。importpsutil#终止指定PID的进程pid_to_terminate=5678#替换成你要终止的进程PIDifpsutil.pid_exists(pid_to_terminate):process=psutil.Process(pid_to_terminate)process.terminate()print(f"进程{pid_to_terminate}已终止。")else:print(f"PID{pid_to_terminate}对应的进程不存在。")123456789105.实时监控系统资源使用psutil可以实现实时监控系统资源使用情况,例如在一个循环中获取CPU使用率:importpsutil#实时监控CPU使用率whileTrue:cpu_percent=psutil.cpu_percent(interval=1)print(f"当前CPU使用率:{cpu_percent}%")123456这些示例展示了psutil模块在系统信息获取、进程管理和系统资源监控方面的基本用法。根据具体需求,你也可以进一步深入使用psutil的其他功能来实现更复杂的系统管理和监控任务。4.实战应用下面是一个使用subprocess模块来启动和监控一个Python程序的示例代码。后面将使用subprocess.Popen()来启动程序,并通过process.poll()来检查该进程是否仍在运行。如果目标程序停止运行,会获取其返回码,并根据返回码决定是否重新启动该程序。具体代码如下所示:importosimportsubprocessimportsysimporttimeimportpsutil#导入psutil模块defstart_target_program(target_script):#显式指定Python解释器和环境变量python_executable=sys.executableenv=dict(os.environ)env['PYTHONPATH']=":".join(sys.path)#将当前Python解释器的路径添加到PYTHONPATH环境变量中#在这里启动你的Python程序returnsubprocess.Popen([python_executable,target_script],env=env)defis_program_running(process):#检查程序是否在运行returnprocess.poll()isNonedefbytes_to_readable(size_bytes):#将字节数转换为可读的格式(KB、MB、GB)forunitin['','KB','MB','GB']:ifsize_bytes
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:53 , Processed in 1.153633 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表