用回车(\ r)处理STDOUTstream的Child_process

我正在编写一个简单的(ish)应用程序,它允许工作的内部系统从远程服务器向另一个使用REST调用激发的远程服务器请求一个复制过程(使用rsync)。

我对express框架已经很熟悉了,刚开始尝试使用child_process库,偶然发现了一个小问题。

我成功地启动rsync进程使用节点的childProcess.spawn() ,我的问题是,rsync输出其行进缓冲回车符(\ r),而不是一个换行符(\ n)。 因此,STDOUT事件process.stdout.on('data', {})仅在调用传输之前被调用一次,然后在复制完成之后,由于STDOUT数据不会被清空作为进度更新返回,只有一个换行符,当工作完成。

在最新版本的rsync(3.1.0)中有一个开关将输出缓冲区结尾改为\ n而不是\ r,但不幸的是,我工作的公司将不会长期采用这个版本。

我正在产卵,并以通常的方式读取child_process ….

 var doCopy = function (onFinish) { var process = childProcess.spawn('ssh', [ source.user + "@" + source.host, "rsync", "-avz", "--progress", source.path + source.file, "-e ssh", dest.user + "@" + dest.host + ":" + dest.path ]); process.on('error', function (error) { console.log("ERR: " + error.code); }) process.stdout.on('data', function (data) { console.log("OUT: " + data); }); process.stderr.on('data', function (data) { console.log("ERR: " + data); }); process.on('close', function (code) { console.log("FIN: " + code); if(onFinish){ onFinish(code); } }); } 

..和控制台输出是….

 OUT: building file list ... OUT: 1 file to consider OUT: test4.mp4 32,768 0% 0.00kB/s 0:00:00 169,738,240 32% 161.84MB/s 0:00:02 338,165,760 64% 161.32MB/s 0:00:01 504,692,736 96% 160.53MB/s 0:00:00 524,288,000 100% 160.35MB/s 0:00:03 (xfr#1, to-chk=0/1) OUT: sent 509,959 bytes received 46 bytes 113,334.44 bytes/sec total size is 524,288,000 speedup is 1,028.01 FIN: 0 

所以你可以看到stdout.on('data,)只有当rsync输出一个新行(有一个'OUT:')时才被调用。

我的问题是,我可以改变这个吗? 当\ r发生时,可能会通过变换来刷新stream? 然后,我可以将这条线正则expression,并再次提供进度更新。

如果没有这个,我想我唯一的select是产生另一个进程来监视正在增长的文件?

任何帮助/build议是非常感谢。

我发现这个非常好的模块,正是我想要实现的。 允许我用任何字符(在我的例子中是'\ r')来分隔stdout缓冲区,并触发一个新的stdout事件来处理数据。 喜欢….

 var splitter = process.stdout.pipe(StreamSplitter("\r")); splitter.on('token', function (data) { console.log("OUT: " + data); }); splitter.on('done', function (data) { console.log("DONE: " + data); });