【发布时间】:2017-04-08 17:14:11
【问题描述】:
我正在创建 NodeJS 应用程序,它创建了很多子进程。它们由spawn 和exec 启动(基于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