【发布时间】:2016-09-30 09:08:15
【问题描述】:
所以我在这里遇到了节点和生成过程的问题..
我正在生成一个外部 exe 进程:
var writeStream = fs.createWriteStream(logPath);
writeStream.write(new Date().toString() + " : " + type + " : LOG STARTED ");
var process = cp.spawn(fileNameExecutable, paramArray, {
cwd: pathToExecutable
});
process.stdout.on('data', function (data) {
writeStream.write(new Date().toString() + " : " + type + " stdout : " + string);
});
var errorLog = "";
process.stderr.on('data', function (data) {
errorLog += data;
writeStream.write(new Date().toString() + " : " + type + " stderr : " + data );
});
process.on("exit", function (exitcode) {
if (exitcode === 1) {
done(new Error(errorLog));
} else {
done();
}
});
问题是这段代码出于某种原因只捕获了进程的标准输出。通过标准错误输出的所有内容都没有到达监听器。
我知道有 stderr 输出,因为当我在命令行上运行相同的命令并附加时
> stdout.txt 2> stderr.txt
要将两个流重定向到一个文本文件,我在 stderr.txt 和 stdout.txt 中都收到了消息
有人知道为什么 stderr 监听器没有在我的 JS 代码中收到这些消息吗?
【问题讨论】:
-
一个提示:不要调用您的子进程变量
process,已经有一个“全局”process对象,这可能会使事情变得混乱(并且可能导致难以追踪错误) . -
您是否尝试将您的
'exit'事件处理程序更改为'close'事件处理程序?您应该几乎总是使用'close',因为那是子进程退出和的时候,stdout 或stderr 流中的任何一个都不会再有数据到达。在'exit'事件之后仍然可以接收数据。
标签: node.js process stdout stderr spawn