【问题标题】:Nodejs read stdout of some process and do stuffNodejs读取一些进程的标准输出并做一些事情
【发布时间】:2017-09-14 00:55:36
【问题描述】:

我想在 Windows 中使用 nodejs 读取某些进程的一些标准输出。

到目前为止,我得到了这个:

我用 :

模拟过程输出
ping -t google.com > ping.txt

ping 输出转储到 ping.txt 文件中。 该文件在节点中被监视以进行更改。

所以,在 nodejs 中我得到了这个代码:

var filename = 'ping.txt';

var fs = require("fs");

fs.watch(filename, function (event, filename) {
    if (event == 'change') {
        console.log('change', filename);

        fs.stat(filename, function (err, stats) {
            console.log('size ', stats.size);

            if(stats.size > 500){                
                fs.truncate(filename,10,function(){
                    console.log("truncated");
                });

            }            
        })
    }
});

但这是我的 nodejs 输出:

size  0
change ping.txt
size  192
change ping.txt
size  253
change ping.txt
size  375
change ping.txt
size  436
change ping.txt
size  559
truncated
change ping.txt
size  620
truncated
change ping.txt
size  743
truncated
change ping.txt
size  804
truncated
change ping.txt
size  926
truncated

文件永远不会被截断。

我不想得到一个巨大的文件大小,因为真正的过程是得到大量的输出。

所以这是尝试截断文件的主要原因。

但它不起作用。

谁能帮帮我?这是我的第一个 nodejs 实验。

稍后我计划通过 websocket 输出 stdout 进程,但现在我遇到了这个问题。

提前致谢!最好的问候!

编辑 1: ping 过程不是我要读取的真实过程。真正的过程是一个加密货币矿工。而且它非常消耗资源。 所以那是因为我采取了这种方法。将进程输出转储到文件中并使用另一个进程读取。 我不是 100% 乐意让 nodejs 管理该加密币进程,因为我不知道 node 是否可以处理它。

如果有更好的方法来做到这一点,我很高兴听到它。谢谢!

【问题讨论】:

  • ping 进程无法告知您已经截断了文件,因此它将继续写入它认为应该在文件末尾的位置。你不能那样做。肯定 node.js 有一个内置的机制来管道孩子的标准输出?
  • 谢谢哈利,就像我在下面的评论中说的那样,真正的过程是加密货币矿工。而且资源非常昂贵。我不知道nodejs是否可以管理它。我不想依赖它。这就是让我想到这种方法的原因,将输出转储到文件并使用另一个进程读取它。你认为这是一个更好的方法吗?还是更好的语言?提前致谢!
  • 为什么孩子的资源密集程度会有所不同?父进程所要做的就是处理输出,对吧?

标签: node.js windows process stdout


【解决方案1】:

我使用 npm 包 rotating-file-stream 做了一个小 sn-p,它似乎可以工作:

// stream.js
const rfs = require('rotating-file-stream');

const stream = rfs('ping.txt', {
  size: '500B', // rotate every 500 Bytes written
});

const stdin = process.openStdin();

stdin.pipe(stream);

在终端ping google.com | node stream.js运行命令

【讨论】:

  • 是的,我以前看过这个方法。但我试图读取输出的真正过程是加密币矿工。所以这是一个非常繁重的过程,vram 很饿。而且我不想依赖 nodejs 来实现它的弹出。
  • 你认为 nodejs 可以管理这样一个繁重的过程并像冠军一样工作吗?或者我会有问题?提前致谢
  • 这里我们使用流 流背后的想法是它会一点一点地获取数据块,所以这个过程不会消耗你的内存或任何东西......理论上节点可以轻松处理,但是真相由你来发现:
  • 我对这个问题的解释是,OP 将输出发送到文件的唯一原因是他们认为(出于某种原因)这比将其发送到管道更有效。从这个角度来看,将其发送到 然后 将其发送到文件的管道可能会适得其反。 :-)
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 2019-04-23
  • 2014-12-29
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多