【问题标题】:Spawned Node (.exe) process doesnt catch stderr messages衍生节点 (.exe) 进程不捕获标准错误消息
【发布时间】: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


【解决方案1】:

好的,所以我终于找到了解决方案..

该应用程序是基于 QT 的 C++ 应用程序,具有以下行为:

Where is located the qDebug qWarning qCritical and qFatal log by default on Qt?

简而言之:通过在节点启动之前将QT_LOGGING_TO_CONSOLE 设置为1,它会被正确记录。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多