You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js PM2:集群模式下如何编程获取所有进程ID

解决PM2集群模式下同步访问进程PID数组的问题

你的核心问题是异步操作的执行顺序:pm2.list是异步方法,不管用回调还是Promise包装,它的执行都晚于同步代码。你直接打印全局变量的时候,异步任务还没完成,变量自然是undefined,而setTimeout只是靠延迟碰运气,完全不可靠。

下面是两种更可靠的解决方案:

方案1:使用顶层await(推荐,Node.js 14.8+ 或 ESM模块环境)

直接在顶层使用await获取PID数组,这样后续代码会等待异步任务完成后再执行:

const pm2 = require("pm2");

async function getPids() {
  return new Promise((resolve, reject) => {
    pm2.list((err, list) => {
      if (err) {
        // 错误要主动reject,避免Promise一直pending
        reject(err);
        return;
      }
      resolve(list.map(process => process.pid));
    });
  });
}

// 顶层await,直接获取结果
const allPids = await getPids();
console.log(allPids); // 正常输出PID数组

// 所有依赖allPids的代码都可以写在这里,比如进程监控、操作等

方案2:封装主逻辑到async函数(兼容所有Node.js版本)

如果你的环境不支持顶层await,就把所有需要用到PID的逻辑放在一个async函数里,通过await等待异步结果:

const pm2 = require("pm2");

async function getPids() {
  return new Promise((resolve, reject) => {
    pm2.list((err, list) => {
      if (err) {
        reject(err);
        return;
      }
      resolve(list.map(process => process.pid));
    });
  });
}

// 主逻辑函数,所有业务代码都在这里执行
async function main() {
  try {
    const allPids = await getPids();
    console.log(allPids);
    
    // 在这里写所有需要使用allPids的逻辑
    // 比如遍历PID做监控、发送信号等
  } catch (err) {
    console.error("获取PM2进程PID失败:", err);
  }
}

// 启动主逻辑
main();

关键优化点

  • 补全了pm2.list的错误处理,通过reject和try/catch捕获错误,避免静默失败
  • 抛弃setTimeout这种依赖时间的不可靠方式,改用Promise的异步流程控制,确保代码在PID获取完成后再执行
  • 避免使用全局变量存储异步结果,直接在异步流程中传递,减少变量作用域问题

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:25:25