【问题标题】:NodeJS child processes are terminated on SIGINTNodeJS 子进程在 SIGINT 上终止
【发布时间】:2017-04-08 17:14:11
【问题描述】:

我正在创建 NodeJS 应用程序,它创建了很多子进程。它们由spawnexec 启动(基于lib 实现)。一些示例可能是用于图像处理的 GraphicsMagick (gm) 或用于 OCR 的 Tesseract (node-tesseract)。现在我想优雅地结束我的应用程序,所以我创建了关闭挂钩:

function exitHandler() {
    killer.waitForShutdown().then(function(){
        logger.logInfo("Exited successfully.");
        process.exit();
    }).catch(function(err) {
        logger.logError(err, "Error during server shutdown.");
        process.exit();
    });
}

process.on('exit', exitHandler);
process.on('SIGINT', exitHandler);
process.on('SIGTERM', exitHandler);

退出处理本身工作正常,等待良好等等,但有一个问题。当时运行的所有“本机”(gm,tesseract,...)进程也被杀死。异常消息仅由“命令失败”和失败的命令内容组成,例如

"Command failed: /bin/sh -c tesseract tempfiles/W1KwFSdz7MKdJQQnUifQFKdfTRDvBF4VkdJgEvxZGITng7JZWcyPYw6imrw8JFVv/ocr_0.png /tmp/node-tesseract-49073e55-0ef6-482d-8e73-1d70161ce91a -l eng -psm 3\nTesseract Open Source OCR Engine v3.03 with Leptonica"

所以至少对我来说,它们没有告诉任何有用的东西。我也在排队进程执行,所以 PC 一次不会被 50 个进程超载。当正在运行的进程被 SIGINT 杀死时,排队的新进程会正常启动并成功完成。我只有在收到 SIGINT 时运行的少数几个问题。这种行为在 Linux (Debian 8) 和 Windows (W10) 上是相同的。从我在这里读到的内容,人们通常会遇到相反的问题(杀死子进程)。我试图搜索标准输入是否以某种方式通过管道传输到子进程中,但我找不到它。这是它应该如何工作的吗?有什么技巧可以防止这种行为吗?

【问题讨论】:

    标签: node.js linux process terminate


    【解决方案1】:

    发生这种情况的原因是,默认情况下,detached 选项设置为false。如果detachedfalse,信号也会被发送到子进程,不管你是否设置了事件监听器。

    要阻止这种情况发生,您需要更改您的spawn 调用以使用第三个参数来指定detached;例如:

    spawn('ls', ['-l'], { detached: true })
    

    来自Node documentation

    在 Windows 上,将 options.detached 设置为 true 可以 子进程在父进程退出后继续运行。孩子 将有自己的控制台窗口。一旦为子进程启用,它 无法禁用。

    在非 Windows 平台上,如果 options.detached 设置为 true,则 子进程将成为新进程组的领导者,并且 会议。请注意,子进程可能会在 无论是否分离,父级都会退出。看 setid(2) 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2015-12-05
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多