我需要从我的 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' }
不幸的是,文档说这已被弃用。
这样做的正确方法是什么?还是我绝对需要缓冲自己?