如何用Python的psutil库获取宿主机而非容器的系统信息?
要让容器内的psutil获取宿主机的系统信息(进程、CPU/内存使用率),核心是打破容器的隔离限制,让容器能访问宿主机的系统文件与PID命名空间,具体修改方案如下:
1. 修改容器启动参数
启动容器时必须添加以下参数,实现宿主机资源的共享与挂载:
docker run --pid=host -v /proc:/host/proc:ro -v /sys:/host/sys:ro [你的镜像名称]
--pid=host:让容器使用宿主机的PID命名空间,确保psutil能识别宿主机的所有进程ID-v /proc:/host/proc:ro:只读挂载宿主机的/proc文件系统(存储进程与系统状态数据)到容器内部-v /sys:/host/sys:ro:只读挂载宿主机的/sys文件系统(存储硬件与内核配置信息)
2. 修改monitor.py,指定psutil读取宿主机路径
在monitor.py开头添加代码,让psutil从挂载的宿主机路径读取数据,而非容器自身的隔离路径:
import os # 指向宿主机的proc和sys挂载目录 psutil.PROCFS_PATH = '/host/proc' psutil.SYSFS_PATH = '/host/sys'
3. 代码与Dockerfile优化建议
- Dockerfile简化:将所有依赖统一写入
requirements.txt,避免重复安装操作。例如requirements.txt内容:
对应Dockerfile安装步骤改为:pika apscheduler prettytable psutil flaskRUN pip3 install --no-cache-dir -r requirements.txt - app.py修复:移除重复的
from flask import Flask导入,修正后开头代码:#!/usr/bin/python3 """ Demonstrating Flask, using APScheduler. """ from flask import Flask import pika import monitor from apscheduler.schedulers.background import BackgroundScheduler - 进程采集逻辑优化:替换原有的PID截取方式,用更可靠的
process_iter遍历进程,同时只保留Top10高CPU进程:def getRunningProcesses(): proc = [] # 遍历所有进程,初始化CPU百分比统计 for p in psutil.process_iter(['pid']): try: p.cpu_percent() proc.append(p) except (psutil.NoSuchProcess, psutil.AccessDenied): pass time.sleep(0.1) # 计算CPU使用率并按降序排序,取Top10 top_list = sorted( [(p, p.cpu_percent() / psutil.cpu_count()) for p in proc], key=lambda x: x[1], reverse=True )[:10] top10_str = str(top_list) print(top10_str) try: add(top10_str) except Exception: pass return top10_str
安全注意事项
挂载/proc和/sys时务必使用ro(只读)权限,防止容器意外修改宿主机系统文件,降低安全风险。
内容的提问来源于stack exchange,提问作者Kyle Ress-Liere
相关产品推荐
相关产品推荐

