快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
开发一个服务器监控工具,使用subprocess.run实现以下功能:1. 通过psutil获取进程列表 2. 用grep过滤关键进程 3. 监控CPU/内存使用率 4. 异常时发送邮件告警 5. 生成HTML报告。要求包含错误处理和日志记录,代码要兼容Linux和Windows系统。 - 点击'项目生成'按钮,等待项目生成完整后预览效果
最近在开发一个服务器监控工具时,深刻体会到Python的subprocess.run有多实用。这个看似简单的函数,在实际生产环境中能解决各种系统操作问题。下面分享5个我在项目中真实应用的场景,以及遇到的坑和解决方案。
1. 跨平台获取进程列表
监控工具首先要获取系统所有进程。虽然psutil库能跨平台工作,但某些定制化场景还是需要调用系统命令。在Linux下用ps -aux,Windows则是tasklist。通过subprocess.run统一封装后:
- 使用
platform.system()判断操作系统类型 - 动态选择对应的命令行指令
- 关键点:必须设置
universal_newlines=True保证输出统一为字符串 - 捕获
CalledProcessError处理命令执行失败的情况
实际使用时发现,Windows的tasklist输出格式复杂,需要额外用正则表达式解析,而Linux的ps命令可以通过--no-header去掉表头简化处理。
2. 智能过滤关键进程
获得进程列表后,需要过滤出目标进程。虽然可以用Python字符串操作,但直接复用grep更高效:
- 在Linux下直接管道连接
ps和grep - Windows没有原生grep,需调用
findstr命令 - 处理特殊字符时发现必须正确转义(比如Java进程的包名含
.) - 记录过滤失败的日志时,注意区分"进程不存在"和"命令执行错误"两种场景
意外收获是发现Windows的findstr支持正则表达式,虽然语法和grep略有不同,但基础功能足够使用。
3. 动态监控系统资源
监控CPU/内存使用率时,需要定时采集数据。这里用subprocess.run调用了这些命令:
- Linux:
top -bn1配合grep提取数值 - Windows:
wmic cpu get loadpercentage和wmic OS get FreePhysicalMemory - 关键技巧:设置
timeout参数避免卡死 - 将输出解析为数值时,发现不同系统小数点格式不同(有的用
.有的用,)
为了降低系统负载,最终采用间隔5秒采集的策略,并用队列平滑波动数据。
4. 异常告警邮件自动化
当指标超标时,需要发送告警邮件。虽然Python有smtplib,但有时调用本地mail或sendmail命令更便捷:
- 准备邮件内容时,注意换行符在Windows和Linux的差异
- 使用
check=True让命令执行失败时自动抛出异常 - 附加系统状态快照到邮件正文时,处理好命令行输出的编码问题
- 遇到权限问题时,改用
/usr/sbin/sendmail完整路径
特别提醒:生产环境建议添加邮件发送失败的重试机制,并记录到独立日志文件。
5. 生成可视化监控报告
最后要将监控数据生成HTML报告。这里用subprocess.run实现了:
- 调用
pandoc将Markdown转换为HTML - 使用系统默认浏览器自动打开报告(
xdg-open或start) - 处理文件路径时,注意Windows的反斜杠需要转义
- 通过
stderr=subprocess.PIPE捕获转换过程中的警告信息
一个实用技巧:在HTML中嵌入SVG图表时,先调用dot命令生成图形再base64编码内联。
避坑经验总结
经过这个项目,总结了这些实战经验:
- 所有命令调用必须设置
timeout,防止僵尸进程 - Windows下路径包含空格时,要用
subprocess.list2cmdline处理 - 重要操作添加
check=True确保执行成功 - 日志记录不仅要存命令输出,还要保存执行的完整命令行
- 考虑命令注入风险,避免直接拼接用户输入
这套监控工具最终在InsCode(快马)平台上完成了部署,发现它的环境预装好了Python和所有依赖库,连sendmail这种系统组件都配置好了,省去了跨平台适配的麻烦。
特别是调试时,可以直接在网页上查看实时日志,比本地开发还方便。对于需要长期运行的服务类项目,这种开箱即用的体验确实能节约不少时间。
快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
开发一个服务器监控工具,使用subprocess.run实现以下功能:1. 通过psutil获取进程列表 2. 用grep过滤关键进程 3. 监控CPU/内存使用率 4. 异常时发送邮件告警 5. 生成HTML报告。要求包含错误处理和日志记录,代码要兼容Linux和Windows系统。 - 点击'项目生成'按钮,等待项目生成完整后预览效果
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考