如何实现进程状态实时监控?含pm2场景及系统API方案咨询
PM2进程实时监控优化方案与系统API调用方法
一、替代轮询pm2 list的更优方案:使用PM2原生API
不用依赖轮询命令行工具,PM2提供了Node.js原生API,支持事件驱动的实时状态推送,比轮询更高效且实时性更强:
核心实现思路
通过PM2的launchBus()方法订阅进程状态变化事件(如进程启动、退出、重启等),当状态发生变更时会主动触发回调,无需定期执行pm2 list。同时也可以主动调用pm2.list()获取当前所有进程的完整状态。
示例代码
const pm2 = require('pm2'); // 连接PM2守护进程 pm2.connect((err) => { if (err) { console.error(err); process.exit(1); } // 订阅进程状态变更事件 const eventBus = pm2.launchBus(); eventBus.on('process:online', (data) => { console.log(`[状态更新] 进程 ${data.process.name} 已上线,PID: ${data.process.pid}`); }); eventBus.on('process:exit', (data) => { console.log(`[状态更新] 进程 ${data.process.name} 已退出,退出码: ${data.process.exit_code}`); }); eventBus.on('process:restart', (data) => { console.log(`[状态更新] 进程 ${data.process.name} 已重启`); }); // 主动获取当前所有PM2进程状态 pm2.list((err, processes) => { if (err) throw err; console.log('当前PM2管理的进程列表:', processes.map(p => ({ name: p.name, pid: p.pid, status: p.pm2_env.status }))); }); });
二、调用操作系统API获取进程状态
完全可以直接调用操作系统原生API获取进程的底层状态,不同系统实现方式不同:
Linux/Unix系统
- 直接读取
/proc虚拟文件系统:每个运行中的进程对应/proc/[PID]目录,其中:/proc/[PID]/stat:包含进程状态(R=运行、S=睡眠、Z=僵尸等)、CPU使用时长、内存占用等核心数据/proc/[PID]/status:更易读的进程状态信息,包含内存、权限等细节/proc/[PID]/cmdline:进程启动时的命令行参数
- 解析这些文件内容,即可实现对进程状态的实时监控,无需依赖PM2。
Windows系统
- 使用Windows原生API:通过
OpenProcess获取进程句柄,再调用GetProcessTimes、GetProcessMemoryInfo等函数获取CPU、内存等指标;也可以通过WMI(Windows管理规范)查询Win32_Process类获取进程数据。 - 在Node.js环境中,可使用封装好的第三方库(如
windows-process-api)简化API调用,避免直接编写C++代码。
三、综合方案
将PM2 API与系统API结合:
- 用PM2 API获取其管理的进程列表及基础状态(如是否在线、重启次数)
- 针对每个进程的PID,调用系统API获取更细粒度的底层指标(如实时CPU使用率、内存占用率)
- 结合两者的数据,构建完整的进程监控视图
内容的提问来源于stack exchange,提问作者qg_java_17137
相关产品推荐
相关产品推荐

