📅  最后修改于: 2023-12-03 15:38:09.871000             🧑  作者: Mango
在 Node.js 中,我们可以通过 process
模块获取当前进程的信息,包括 pid
、ppid
等属性。同时,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
字符的进程,并将其转换为一个包含进程信息的数组。
在 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 获取节点进程列表的两种方法,你可以根据自己的需求进行选择。