【问题标题】:Child process isn't logging when receiving SIGINT接收 SIGINT 时子进程未记录
【发布时间】:2020-04-05 01:34:36
【问题描述】:

我正在尝试在 Node.js 中终止以前派生的子进程。我不确定它是否有效,因为我的 console.log 行没有在子进程中被击中。

这是我从家长那里打来的电话:

console.log("sending SIGINT from main");
child.kill("SIGINT");

在孩子身上:

process.on("SIGINT", () => {
  console.log("Killing bot");
  DBS.Bot.destroy();
  process.exit();
});

我看到的唯一控制台日志来自父级。

【问题讨论】:

    标签: node.js process electron


    【解决方案1】:

    在生成 NodeJS 子进程时,此子进程的“stdout”与父进程的“stdout”流不同,这就是您看不到任何日志记录输出的原因。您可以添加以下代码,将子进程的任何输出复制到主进程的stdout 流:

    child.stdout.on ("data", (data) => {
        console.log ("child process: " + data.toString ());
    });
    

    在某些情况下,捕获stderr 输出也很有用,这是 NodeJS 的 console.err () 写入的流:

    child.stderr.on ("data", (data) => {
        console.log ("child process error: " + data.toString ());
    });
    

    另外,为了确保子进程以非错误代码退出,即退出代码为 0,您可以使用 NodeJS 的 child_process "exit" 信号:

    child.on ("exit", (code, signal) => {
        if (signal !== null) console.log ("child exited due to signal '" + signal + "'");
        else console.log ("child exited with code " + code);
    });
    

    如需了解更多信息,请务必查看NodeJS' documenation on child_process

    【讨论】: