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

时间:2013-07-03 19:44:50

标签: node.js

让我们来看,例如"顶部"显示系统信息并定期更新的应用程序。

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

#!/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一样)。

我最初的目标是编写使用scp发送文件的脚本。完成后,然后注意到我缺少scp本身显示的进度信息。看看scp节点模块,他们也不代理它。所以回溯到像top这样的常见应用程序。

1 个答案:

答案 0 :(得分:2)

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

对于您的stdout次读取,top看到其stdin不是tty且退出并出现错误,因此stdout上没有输出。你可以在shell中看到这种情况发生echo | top它会退出,因为stdin不会是tty。

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

当然,top有分析代码来执行平均等等,您可能需要重新实现,因此屏幕抓取和通过干净数据源都有利有弊,以及既简单又困难。但我的0.02美元将专注于良好的数据源,而不是试图筛选控制台用户界面。

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

只是要明确,是的,当然可以将top作为子进程运行,欺骗它认为有一个tty和所有相关的环境设置,并获取它正在编写的数据。它只是非常复杂,类似于通过在电视屏幕上拍摄天气频道的照片并在其上运行光学字符识别来尝试获取天气。风格点,但有更简单的方法。如果您需要研究有关将控制台程序作为子进程运行的更多信息,请查看expect命令。