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

1.简介

在关键的应用程序中,监听程序的运行状态十分重要,因为其可以确保程序的平稳运行。本文将介绍如何使用Python实现这一功能,这里主要使用psutilsubprocess模块。同时,最后会提供一个完整的脚本案例供参考,用于监控并在目标程序意外停止时重启程序。

2.subprocess模块介绍

subprocess 模块是 Python 中用于创建和管理子进程的标准库模块。它允许你执行系统命令其他可执行文件,获取它们的输出,以及与其交互。下面是一些 subprocess 模块的基本用法和示例:

1. 运行外部命令

你可以使用 subprocess.run() 函数来运行外部命令,并等待其完成:

import subprocess# 运行一个简单的命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)# 打印命令输出
print(result.stdout)
  • ['ls', '-l'] 是一个示例命令,它列出当前目录的详细文件信息。
  • capture_output=True 表示捕获命令的标准输出和标准错误输出。
  • text=True 表示输出以文本字符串的形式返回,而不是字节。

2. 后台执行命令

如果你希望命令在后台执行而不阻塞当前进程,可以使用 subprocess.Popen 类:

import subprocess# 后台执行命令
process = subprocess.Popen(['python', 'target.py'])# 等待命令完成
process.wait()

3. 获取命令输出

如果需要获取命令的输出,可以使用 subprocess.check_output() 函数:

import subprocess# 获取命令输出
output = subprocess.check_output(['echo', 'Hello, subprocess!'], text=True)# 打印输出
print(output)

4. 传递输入给命令

有时候需要将数据传递给命令的标准输入。可以使用 subprocess.Popen.communicate() 方法来实现:

import subprocess# 启动命令并传递输入
process = subprocess.Popen(['grep', 'Python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)# 向命令输入数据
output, _ = process.communicate('Python is awesome!')# 打印命令输出
print(output)

5. 处理命令返回值

通过 subprocess.run()subprocess.Popen.wait() 可以获取命令的返回值,通常是命令的退出代码。这可以帮助你判断命令是否成功执行。

3.psutil模块介绍

psutil(Python System and Process Utilities)模块是一个跨平台的库,提供了方便的接口来获取系统信息和管理进程。它可以用于监控系统资源的使用情况、管理进程以及执行系统管理任务。以下是 psutil 模块的一些主要功能和使用示例:

1. 安装 psutil

首先确保你已经安装了 psutil 模块。如果没有安装,可以通过 pip 安装:

pip install psutil

2. 获取系统信息

使用 psutil 可以轻松地获取系统的各种信息,如 CPU 使用率、内存使用情况、磁盘分区信息等。

import psutil# 获取 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()
for partition in disk_partitions:print(f"分区设备: {partition.device}, 文件系统: {partition.fstype}")

3. 获取进程信息

psutil 可以用来获取系统中运行的进程信息,包括进程列表、CPU 使用率、内存使用情况等。

import psutil# 获取所有进程列表
all_processes = list(psutil.process_iter())
for proc in all_processes[:5]:  # 打印前五个进程print(f"进程名: {proc.name()}, PID: {proc.pid}")# 获取指定 PID 进程的详细信息
pid = 1234  # 替换成你要查看的进程 PID
if psutil.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} 对应的进程不存在。")

4. 进程管理操作

psutil 还允许对进程进行管理操作,如终止进程、发送信号等。

import psutil# 终止指定 PID 的进程
pid_to_terminate = 5678  # 替换成你要终止的进程 PID
if psutil.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} 对应的进程不存在。")

5. 实时监控系统资源

使用 psutil 可以实现实时监控系统资源使用情况,例如在一个循环中获取 CPU 使用率:

import psutil# 实时监控 CPU 使用率
while True:cpu_percent = psutil.cpu_percent(interval=1)print(f"当前 CPU 使用率: {cpu_percent}%")

这些示例展示了 psutil 模块在系统信息获取、进程管理和系统资源监控方面的基本用法。根据具体需求,你也可以进一步深入使用 psutil 的其他功能来实现更复杂的系统管理和监控任务。

4.实战应用

下面是一个使用subprocess模块来启动和监控一个Python程序的示例代码。后面将使用subprocess.Popen()来启动程序,并通过process.poll()来检查该进程是否仍在运行。如果目标程序停止运行,会获取其返回码,并根据返回码决定是否重新启动该程序。
具体代码如下所示:

import os
import subprocess
import sys
import time
import psutil  # 导入 psutil 模块def start_target_program(target_script):# 显式指定Python解释器和环境变量python_executable = sys.executableenv = dict(os.environ)env['PYTHONPATH'] = ":".join(sys.path)  # 将当前Python解释器的路径添加到PYTHONPATH环境变量中# 在这里启动你的Python程序return subprocess.Popen([python_executable, target_script], env=env)def is_program_running(process):# 检查程序是否在运行return process.poll() is Nonedef bytes_to_readable(size_bytes):# 将字节数转换为可读的格式(KB、MB、GB)for unit in ['', 'KB', 'MB', 'GB']:if size_bytes < 1024.0:return f"{size_bytes:.2f} {unit}"size_bytes /= 1024.0def monitor_process(target_script):# 启动被监测的程序target_program = start_target_program(target_script)while True:# 检查并打印 CPU 利用率cpu_percent = psutil.cpu_percent(interval=1)print(f"当前 CPU 利用率:{cpu_percent}%")# 获取并打印内存信息memory_info = psutil.virtual_memory()total_memory = bytes_to_readable(memory_info.total)available_memory = bytes_to_readable(memory_info.available)print(f"总内存: {total_memory}")print(f"可用内存: {available_memory}")# 获取并打印磁盘分区信息disk_partitions = psutil.disk_partitions()print("磁盘分区信息:")for partition in disk_partitions:print(f"    分区:{partition.device} 挂载点:{partition.mountpoint}")# 检查程序是否在运行if not is_program_running(target_program):# 检查程序结束状态(是否是正常结束)if target_program.returncode == 0:print("被监测的程序已正常关闭。")breakelse:print(f"被监测的程序已关闭,返回代码:{target_program.returncode}")print("重启中...")target_program = start_target_program(target_script)else:print("被监测的程序正常运行...")# 每隔10分钟监听一次time.sleep(600)if __name__ == '__main__':# 需要注意被监控脚本的路径和监控程序保持在同一目录下target_script = input("请输入你需要监控的脚本名称(xxx.py):")monitor_process(target_script)

通过结合使用 subprocess 和 psutil 模块,可以轻松实现对目标程序的监控和管理。
本文提供了一个简单的示例代码,展示了如何启动、监控和重启一个程序。希望这能帮助你更好地理解和使用 Python 进行系统和进程管理。

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

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

相关文章

Vue3-15 表单的绑定

在Vue 3中&#xff0c;表单输入绑定是实现动态数据双向绑定的重要部分&#xff0c;它让开发者可以轻松地管理和响应用户输入。本文将详细介绍如何在Vue 3中利用v-model指令以及一些特定修饰符来处理不同类型的表单输入。 响应式表单数据 首先&#xff0c;我们定义了一个响应式…

Linux /etc/profile 详解

概述 Linux是一个多用户的操作系统。每个用户登录系统后&#xff0c;都会有一个专用的运行环境。通常每个用户默认的环境都是相同的&#xff0c;这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制&#xff0c;其方法就是修改相应的系统环境变量&…

Git 前端开发者必备:常用命令全解析

&#x1f6a9;前言 在前端开发的日常工作中&#xff0c;Git 是必不可少的版本控制系统&#xff0c;它帮助我们追踪代码的变化&#xff0c;协作开发&#xff0c;以及恢复到之前的代码状态。熟练掌握Git的基本命令&#xff0c;可以大大提高工作效率和代码管理能力。本文将详细介…

如何检测代理IP是否有效?检查因素与方法全解

代理IP是一种网络代理技术&#xff0c;它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时&#xff0c;我们的真实IP地址会被隐藏起来&#xff0c;而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下&#xff1a; 1.选择合适的代理服务器 考虑服务…

【JavaEE】网络原理——传输层协议

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;上一篇文章&#xff1a;【JavaEE】网络编程—…

CDGA|数据治理:标准化处理与确保数据可溯源性

在当今信息爆炸的时代&#xff0c;数据已成为企业决策、科学研究和政府管理的核心要素。然而&#xff0c;随着数据量的不断增加和来源的多样化&#xff0c;数据治理成为了一个亟待解决的问题。特别是在处理复杂数据时&#xff0c;标准化处理和确保数据的可溯源性显得尤为重要。…

ERROR: No matching distribution found for matplotlib

1.问题&#xff1a;安装matplotlib报错&#xff0c;如下图所示&#xff1a; 2.通过换源&#xff0c;输入以下命令&#xff1a;python -m pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com&#xff0c;但是还是无效 3.在pycharm中升级…

【java算法专场】滑动窗口(上)

目录 滑动窗口 基本概念 长度最小的子数组 算法分析 算法步骤 示例 算法代码 无重复字符的最长子串 算法分析 算法步骤 示例 算法代码 最大连续1的个数 III 算法分析 算法步骤 示例 算法代码 将 x 减到 0 的最小操作数 算法分析 算法步骤 示例 算法代码 滑动…

location匹配的优先级和重定向

nginx的重定向&#xff08;rewrite&#xff09; location 匹配 location匹配的就是后面的uri /wordpress 192.168.233.10/wordpress location匹配的分类和优先级 1.精确匹配 location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配 ^-前缀级别&#xff…

CSS实现从上往下过渡效果

要实现一个从上往下显示的过渡效果&#xff0c;可以使用CSS的keyframes规则来创建一个动画&#xff0c;使得元素在垂直方向上逐渐改变其位置。以下是一个简单的例子&#xff1a; CSS代码 keyframes slide-down {from {transform: translateY(-100%);opacity: 0;}to {transform…

[Vulnhub] Stapler wp-videos+ftp+smb+bash_history权限提升+SUID权限提升+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.106TCP:21,22,53,80,123,137,138,139,666,3306, Using Nmap for scanning: $ nmap -p- 192.168.8.106 --min-rate 1000 -sC -sV The results are as follows: PORT STATE SERVICE VERSION 20/tcp closed ftp-data…

Java常用的三种注解

1、 基本注解 一、注解的概念 1、注解也叫元数据&#xff0c;是JDK1.5版本开始引入的一个特性&#xff0c;用于对代码进行说明&#xff0c;可以对包、类、接口、字段、方法参数、局部变量等进行注解。注解的形式是“单词”。 在不改变原有逻辑的情况下&#xff0c;使用注解在源…

白化(Whitening)的原理是什么?

**白化&#xff08;Whitening&#xff09;**是数据预处理中的一个重要步骤&#xff0c;其目的是将原始数据的各个维度之间的线性相关性去除&#xff0c;并使得每个维度的方差都为1。通过白化&#xff0c;可以简化后续的数据处理步骤&#xff0c;如独立成分分析&#xff08;ICA&…

ODrive学习笔记一:开发环境搭建

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

【简历】兰州某大学一本硕士:面试通过率基本是为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一个一本硕士的Java简历&#xff0c;那这个简历因为学校本身&#xff0c;它是一个一本的硕士&#xff0c;我们一般认为这一本硕士&a…

java-mysql 三层架构

在 Java 应用程序中&#xff0c;三层架构&#xff08;Three-Tier Architecture&#xff09;是一种常见的设计模式&#xff0c;用于分离应用程序的表示层、业务逻辑层和数据访问层。这种架构有助于提高代码的可维护性、可扩展性和可重用性。以下是详细解释 Java 应用程序中使用 …

如何增强人工智能的人岗匹配?

你玩过媒人游戏吗&#xff1f;这不是一件容易的事情。在家庭作业的世界里&#xff0c;匹配员工的技能通常是非常具有挑战性的。然而&#xff0c;技术在简化过程中起着至关重要的作用。利用人工智能构建技能本身将建立一个更准确、更动态的数据库&#xff0c;以促进未来人工智能…

MySQL学习(10):事务

1.什么是事务 事务是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;事务会把所有操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 *事务四大特性 原子性事务是不可分割的最小操作单元&#x…

Vxe UI vxe-table column 根据内容的长度来自适应列的宽度

Vxe UI vue vxe-table 根据内容的长度来自适应列的宽度 列的 width 宽度支持多种格式&#xff08;默认情况下是等比例分配&#xff09;&#xff1a; 固定像素&#xff1a;100 或者 ‘100px’ 百分比&#xff1a;‘20%’ 自适应内容&#xff1a;‘auto’ 代码 <template&g…

超声波清洗机哪个牌子好?耐用的超声波眼镜清洗机推荐

超声波清洗机大家也一定不陌生了&#xff0c;提起超声波清洗机啊&#xff0c;大家对他的印象一定是清洗眼镜&#xff0c;这话没毛病&#xff0c;但是&#xff0c;这仅仅只是清洗机的基本功&#xff0c;清洗机的功能远远比咱们想象中的强大&#xff0c;但是目前市面上的小型超声…