Nodejs 怎么才可以获得 top命令的结果

Nodejs 怎么才可以获得 top命令的结果

我是新手,想通过获取控制台输出,实现对server的监控,在mac机上用child_process 无法获得top命令的结果,总是提示 error: initializing curses,这是怎么回事?如何解决?谢谢!!

var spawn = require(‘child_process’).spawn, //com = spawn(‘iostat’,[’-w 1 | less -S’]);这个命令执行正常,可以得到结果 com = spawn(’/usr/bin/top’, []); //总是提示 error: initializing curses var io = require(‘socket.io’).listen(5555); com.stdout.on(‘data’, function(data){ io.sockets.emit(‘get result’, data); } );

com.stderr.on(‘data’, function(data){ console.log('stderr: ’ + data);

});`

我搜了下有人也遇到同样的问题,但是不知道解决了没,供大家参考 http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/24248


7 回复

当然,我可以帮助你解决这个问题。在Mac OS上使用top命令时遇到的错误通常是由于top命令试图初始化一个交互式的界面,而这种界面不适用于非交互式环境(如Node.js中的子进程)。为了解决这个问题,你可以使用top命令的批处理模式或使用其他替代工具来获取系统资源使用情况。

解决方案

使用 top 的批处理模式

你可以尝试使用top命令的批处理模式,这将返回一个静止的输出,而不是交互式界面。你可以通过添加-l 1 -n 1选项来实现这一点,这样top命令只会运行一次并返回结果。

var spawn = require('child_process').spawn;

var com = spawn('/usr/bin/top', ['-l 1', '-n 1']);

com.stdout.on('data', function(data) {
    console.log('stdout: ' + data.toString());
});

com.stderr.on('data', function(data) {
    console.log('stderr: ' + data.toString());
});

com.on('close', function(code) {
    console.log('Child process exited with code ' + code);
});

使用 psawk 命令

如果你只需要CPU和内存的使用情况,可以使用ps命令结合awk来获取这些信息:

var spawn = require('child_process').spawn;

var com = spawn('/bin/sh', ['-c', 'ps -eo %cpu,%mem,command | sort -nrk 1 | head -n 5']);

com.stdout.on('data', function(data) {
    console.log('stdout: ' + data.toString());
});

com.stderr.on('data', function(data) {
    console.log('stderr: ' + data.toString());
});

com.on('close', function(code) {
    console.log('Child process exited with code ' + code);
});

这段代码会返回CPU使用率最高的前5个进程的信息。

解释

  • spawn 函数用于创建一个新的子进程。
  • -l 1 -n 1 参数使top命令只运行一次并返回结果。
  • ps -eo %cpu,%mem,command | sort -nrk 1 | head -n 5 这段命令用于获取CPU使用率最高的前5个进程的信息。
  • on('data') 监听器用于捕获子进程的标准输出和标准错误输出。
  • on('close') 监听器用于监听子进程退出事件。

希望这能解决你的问题!如果还有其他疑问,请随时提问。


topn -cbn 1

MacOS没这条命令吧

楼主给出的链接里面,老外已经明确的给出了答案,试过了没

var top = spawn('/usr/bin/top', [], {customFds: [process.stdin.fd, -1,-1]});

试过了不行。手头没有linux机器,不知道在linux下”top -b“ 可行

我在ubuntu下试了,可以的.

要通过Node.js获取top命令的输出,你需要理解top命令通常与终端交互,而不是直接输出到标准输出。这是因为top命令通常使用一个称为curses的库来创建交互式的用户界面,这使得它不能直接通过Node.js的标准进程方法来捕获其输出。

但是,如果你只是想要周期性地获取系统的性能指标(如CPU和内存使用率),而不是完整top命令的交互式输出,你可以考虑使用其他更适合作为Node.js程序输入的数据源,比如ps命令或系统监控工具(如Prometheus)的API。

示例代码:使用ps命令

如果你想使用ps命令来获取当前运行进程的信息,你可以这样做:

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

function getProcessStats() {
    exec('ps aux', (error, stdout, stderr) => {
        if (error) {
            console.error(`exec error: ${error}`);
            return;
        }
        console.log(`stdout: ${stdout}`);
        console.error(`stderr: ${stderr}`);
    });
}

setInterval(getProcessStats, 1000); // 每秒调用一次

这段代码会每秒执行一次ps aux命令,并打印出其输出。这能给你一个类似于top的概览,但不是实时更新的界面。

解决你的问题

对于你的原始问题,你可能需要使用top的非交互模式,即捕获其静态输出,而不是实时更新。不幸的是,top没有直接提供这样的选项。你可以考虑使用uptimeps或者系统监视器API来替代。

如果确实需要获取top命令的实时数据,你可能需要编写一个脚本,该脚本将top命令的输出保存到文件中,然后让Node.js程序定期读取这个文件。

回到顶部