Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用node.js读取应用程序标准数据_Node.js - Fatal编程技术网

使用node.js读取应用程序标准数据

使用node.js读取应用程序标准数据,node.js,Node.js,让我们以显示系统信息并定期更新的“top”应用程序为例 我想使用node.js运行它并显示该信息(和更新!)。 我想出的代码是: #!/usr/bin/env node var spawn = require('child_process').spawn; var top = spawn('top', []); top.stdout.on('readable', function () { console.log("readable"); console.log('stdo

让我们以显示系统信息并定期更新的“top”应用程序为例

我想使用node.js运行它并显示该信息(和更新!)。 我想出的代码是:

#!/usr/bin/env node

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

var top = spawn('top', []);

top.stdout.on('readable', function () {
    console.log("readable");
    console.log('stdout: '+top.stdout.read());
});
它不像我想象的那样。事实上,它什么也不产生:

readable
stdout: null
readable
stdout:
readable
stdout: null
然后退出(这也是出乎意料的)

以top应用程序为例。目标是通过节点代理这些更新并在屏幕上显示它们(与直接从命令行运行top的方式相同)


我最初的目标是编写使用scp发送文件的脚本。这样做,然后注意到我丢失了scp本身显示的进度信息。查看了scp节点模块,它们也没有代理它。因此,回到常见的应用程序,如top。

top
是一个交互式控制台程序,旨在针对实时伪终端运行

至于您的
stdout
读取,
top
看到它的
stdin
不是一个tty并且带错误退出,因此在
stdout
上没有输出。如果执行
echo | top
操作,您可以在shell中看到这种情况,它将退出,因为stdin将不是tty

即使它实际上正在运行,它的输出数据也将包含用于操作固定维度控制台的控制字符。(如“将光标移动到第2行的开头”)。它是一个交互式用户界面,作为编程数据源是一个糟糕的选择。“屏幕抓取”和解释这些数据并提取有意义的信息将是相当困难和脆弱的。您是否考虑过更干净的方法,例如从
/proc/meminfo
文件和内核为此目的公开的其他特殊文件中获取所需的数据?最终,
top
是从现成的特殊文件和系统调用中获取所有这些数据,因此您应该能够访问便于编程访问的数据源,而不是试图筛选scrape top

当然,
top
有分析代码来做平均值等等,您可能需要重新实现,所以屏幕抓取和清理干净的数据源都有利弊,也有容易和困难的方面。但我的$0.02将专注于良好的数据源,而不是试图在控制台UI上进行筛选

需要考虑的其他选择/资源:

  • free
    命令,例如
    free-m
  • vmstat
  • 和其他命令
  • 设计用于帮助自动化需要终端的控制台程序

需要明确的是,确实可以将
top
作为子进程运行,诱使它认为存在tty和所有相关的环境设置,并获取它正在写入的数据。这非常复杂,类似于在电视屏幕上拍摄天气频道的照片并在上面运行光学字符识别来获取天气。风格有点不同,但有更简单的方法。如果您需要进一步研究如何诱使控制台程序作为子进程运行,请查看
expect
命令。

top只是一个示例。还有其他显示执行进度等的应用程序,如果可能的话,我想通过节点将该数据代理到屏幕或文件。更新说明top正在退出,因为stdin不是tty.Peter,top或类似应用程序如何显示其数据,它们确实没有将其作为标准输出?当您在shell中交互运行
top
时,它是
stdout
数据流是shell的tty(伪终端),因此它确实将数据写入
stdout
,但当您通过child\u进程运行它时,
top
会看到
stdout
不是tty,只是退出。它需要一个tty以及其他东西,比如一个术语环境变量,然后才能开始正常工作。