📜  如何列出节点进程 - Javascript (1)

📅  最后修改于: 2023-12-03 15:38:09.871000             🧑  作者: Mango

如何列出节点进程 - JavaScript

在 Node.js 中,我们可以通过 process 模块获取当前进程的信息,包括 pidppid 等属性。同时,Node.js 也提供了 child_process 模块,可以与操作系统进行交互,例如启动新的进程并返回 stdout 和 stderr。

接下来,我们将介绍通过 child_process 模块和操作系统交互来获取节点进程列表的方法。

方法一:使用 ps 命令获取进程列表

ps 命令可以在 Linux 和 macOS 等 POSIX 处理系统中查询当前系统进程信息。我们可以使用 child_process 模块来执行 ps 命令,并将其输出转换为 JavaScript 对象,以获取节点进程列表。

const { exec } = require('child_process');

exec('ps aux | grep node', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }

  const processes = stdout.trim().split('\n').map(line => {
    const columns = line.trim().split(/\s+/);
    return {
      user: columns[0],
      pid: columns[1],
      cpu: columns[2],
      mem: columns[3],
      vsz: columns[4],
      rss: columns[5],
      tty: columns[6],
      stat: columns[7],
      start: columns[8],
      time: columns[9],
      command: columns.slice(10).join(' '),
    };
  });

  console.log(processes);
});

上述代码中,我们使用 ps aux | grep node 命令来过滤包含 node 字符的进程,并将其转换为一个包含进程信息的数组。

方法二:使用操作系统 API 获取进程列表

在 Windows 操作系统上,我们可以使用 wmic 命令获取进程列表。在 macOS 上,我们可以使用 sysctl 命令。在 Linux 上,我们可以读取 /proc 文件系统中的进程信息。这些命令或文件系统都是操作系统提供的 API,可以直接从 Node.js 中调用。

下面是一个使用 /proc 文件系统获取进程列表的示例:

const fs = require('fs');

const pids = fs.readdirSync('/proc')
  .filter(entry => /^\d+$/.test(entry))
  .map(entry => parseInt(entry, 10))
  .filter(pid => {
    try {
      return fs.statSync(`/proc/${pid}`).isDirectory();
    } catch (_) {
      return false;
    }
  });

const processes = pids.map(pid => {
  const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');
  const columns = stat.trim().split(/\s+/);
  const command = fs.readFileSync(`/proc/${pid}/cmdline`, 'utf8').split('\0').join(' ');

  return {
    pid,
    ppid: parseInt(columns[3], 10),
    cpu: parseInt(columns[13], 10) + parseInt(columns[14], 10),
    mem: parseInt(columns[23], 10),
    vsz: parseInt(columns[22], 10),
    rss: parseInt(columns[24], 10),
    tty: 0,
    stat: columns[2],
    start: '',
    time: '',
    command,
  };
});

console.log(processes);

上述代码中,我们首先使用 fs.readdirSync('/proc') 获取当前系统中所有的进程 id,再使用 fs.statSync 判断该 id 是否是一个进程目录。最终,我们读取 /proc/${pid}/stat/proc/${pid}/cmdline 文件获取进程的详细信息。

以上就是通过 JavaScript 获取节点进程列表的两种方法,你可以根据自己的需求进行选择。