我需要从我的Node.js脚本执行shell命令,读取其输出并在读取一定数量的字节后终止该程序。 (更确切地说,我想通过smbget
)部分下载文件。
我猜测,最明显的方法是使用childprocess.spawn()
,手动缓冲输出,并在读取足够数据时简单地kill()
进程。
这很好用,除了我看起来有点笨重。所以我想要聪明(TM)并使用head
。因此,我按照文档中的说明将所有内容连接到child_process(或者更方便地使用procstreams)来生成相当于cat /dev/urandom | head --bytes=10
的管道。唉,一切都如火如荼:
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at errnoException (net.js:883:11)
at Pipe.onread (net.js:539:19)
可能是因为head
只是将流媒体归结为死亡,而我无法找到捕获或以其他方式处理该错误的方法(尽管这可能只是因为我是节点n00b :)。
或者,我可以执行以下操作:
var cmd = 'cat /dev/urandom | head --bytes=100';
childprocess.exec(cmd, function (err, stdout, stderr) {
// ...
});
除了我不能再访问原始(二进制)数据。当我打电话
fs.writeFileSync('foo.dat', stdout);
流将被utf8编码,导致文件大约180字节而不是预期的100字节。
通过将第二个参数传递给exec
:
{ encoding: 'binary' }
不幸的是,文档说这已被弃用。
这样做的正确方法是什么?或者我绝对需要缓冲自己?
答案 0 :(得分:1)
从技术上讲,你应该能够将'buffer'作为编码传递并让它专门输出一个Buffer,但看起来并非如此。我opened a ticket for it,应该在v0.12发布之前修复。
暂时可以随意使用二进制编码。它只是被弃用了,但永远不会消失。在v0.11 it received some love中,现在是latin1编码的同义词。这是由v8正式支持的,因此支持不会很快消失。