【问题标题】:Node.js detect a child process exitNode.js 检测到子进程退出
【发布时间】:2016-01-20 01:31:43
【问题描述】:

我在 node 中工作,因为它是通过 Visual Studio 代码扩展发生的。我成功地创建了子进程,并且可以根据命令终止它们。我希望在进程意外退出时运行代码,这似乎是“退出”事件的目的,但我不清楚如何调用它,这是我正在使用的代码,进程运行,但在退出时不检测/登录,请注意 output.append 是特定于 Visual Studio 代码的 console.log() 版本:

        child = exec('mycommand', {cwd: path}, 
        function (error, stdout, stderr) { 
            output.append('stdout: ' + stdout);
            output.append('stderr: ' + stderr);
            if (error !== null) {
                output.append('exec error: ' + error);
            }
        });

        child.stdout.on('data', function(data) {
            output.append(data.toString()); 
        });

这是我尝试过的四件事,但在退出登录时不起作用:

        child.process.on('exit', function(code) {
            output.append("Detected Crash");
        });

        child.on('exit', function(code) {
            output.append("Detected Crash");
        });

        child.stdout.on('exit', function () {
            output.append("Detected Crash");
        });

        child.stderr.on('exit', function () {
            output.append("Detected Crash");
        });

【问题讨论】:

  • 你运行的是哪个版本的 node.js?

标签: node.js exit child-process


【解决方案1】:

查看node.js source code for the child process module.exec() 方法本身就是这样做的:

child.addListener('close', exithandler);
child.addListener('error', errorhandler);

而且,我认为.on().addListener() 的快捷方式,所以你也可以这样做:

child.on('close', exithandler);
child.on('error', errorhandler);

【讨论】:

  • 这是正确的,child.on('close', exithandler) 确实在子进程结束时调用。现在我有另一个问题。我的子进程生成更多进程,我可以强制杀死子进程和关联的子进程,但我还想做的是在生成子进程失败/关闭时杀死顶级子进程。问题是我不执行子进程的子进程,因此在节点中没有引用,它们是由 CLI 工具自动启动的(我的示例中的 mycommand 是已安装的 CLI 工具)。有什么想法可以解决这个问题吗?
  • @edencorbin - 很高兴我们解决了您的第一个问题。使用 node.js 的一大好处是您可以随时查看源代码。我发现 node.js 文档有些欠缺,所以源代码对于回答这样的问题非常方便。对于您的其他问题,我建议您对新问题创建一个很好的描述并为该问题打开一个新问题,因为它几乎是一个新问题。
  • 好的,刚刚根据我的评论创建了一个新问题:stackoverflow.com/questions/34884055/…
  • 当退出处理程序和错误处理程序是同一个函数时,这可能会产生意想不到的副作用。在这种情况下,它可能会被调用两次。
  • @JeroenBollen - 在我的回答中,我曾建议退出和关闭处理程序应该是同一个函数吗?
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2012-11-10
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多