节点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返回stdout
和stderr
以及一个很好的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
,因为它等待孩子的stdio
stream。
欲了解更多信息,请参阅Event: 'exit'
文档 :
该事件在subprocess结束后发出。
请注意,subprocessstdiostream可能仍然处于打开状态。
和Event: 'close'
文档 :
当一个subprocess的stdiostream全部终止时,这个事件被发射。