节点Kue和subprocess – 从产生的进程中获取错误

我尝试通过Kue的作业队列产生一个执行cpu密集计算的subprocess。 我的代码目前看起来像这样:

consumer.js

var kue = require('kue'); var util = require('util'); var spawn = require('child_process').spawn; var jobs = kue.createQueue(); jobs.process('calc', 2, function(job, done){ var work = spawn('Rscript', ['opti2.R', job.data.file]); work.stderr.on('data', function (data) { job.log('stderr: ' + data); }); work.stdout.on('data', function (data) { job.log('stdout: ' + data); }); work.on('exit', function (code, signal) { console.log('child process exited with code ' + code + ' with singal ' + signal); if(code != 0){ done(****How to get the stderr of the child process as an error here***); } else { done(Error()); } }); }); 

代码有点做我想做的事情,但有没有更好的方式来报告失败的工作(到Kue),并从产生的过程得到stderr?

您可以使用job.log方法将数据直接发送到Kue

我也build议你从.spawn切换到.exec ,因为它在最后的callback中以string的forms返回stdoutstderr以及一个很好的error ,这很好地满足你的需求:

 var exec = require('child_process').exec; jobs.process('calc', 2, function(job, done){ exec('Rscript opti2.R ' + job.data.file, function (error, stdout, stderr) { if (stdout.length > 0) job.log('stdout: ' + stdout); if (stderr.length > 0) job.log('stderr: ' + stderr); done(error); }); }); 

尽pipe解决scheme也应该和.spawn工作:只需用job.log将代码中的每个console.log调用replacejob.log

虽然,您可能需要缓冲您的stderr以便将其发送到Kue在一个块:

 jobs.process('calc', 2, function(job, done){ var work = spawn('Rscript', ['opti2.R', job.data.file]); var stderr = ''; work.stderr.on('data', function (data) { stderr += data; }); work.stdout.on('data', function (data) { job.log(data); // sending arriving `stdout` chunks as normal log events }); work.on('close', function (code, signal) { console.log('child process exited with code ' + code + ' with singal ' + signal); if(code != 0){ done(stderr); // sending all collected stderr as an explanation } else { done(); } }); }); 

我也build议使用close事件,而不是exit ,因为它等待孩子的stdiostream。

欲了解更多信息,请参阅Event: 'exit'文档 :

该事件在subprocess结束后发出。

请注意,subprocessstdiostream可能仍然处于打开状态。

Event: 'close'文档 :

当一个subprocess的stdiostream全部终止时,这个事件被发射。