首页 > 解决方案 > 无法使用 PM2 和 NodeJS 捕获关闭信号

问题描述

早上好,

我在使用 PM2 运行的服务器内捕获关闭信号时遇到了很多困难。我已经阅读了很多文章并尝试了很多答案,但似乎没有任何效果。

我的设置:PM2 v2.10.0(由于运行最新的 PM2(3.2.2 和 3.2.3)与不断弹出的 CMD 屏幕相关的一些问题),NodeJS v6.11.3(因为这是我们的应用程序支持的版本), Windows 10.0.17134 内部版本 17134

我尝试了以下解决方案:

process.on('SIGINT', () => {
    console.info("Received the SIGINT signal to shut down.");
})

process.on('SIGTERM', () => {
    console.info('Received the SIGTERM signal to shut down');
})

process.on('message', (msg) => {
    console.info('Message received');
    if (msg == 'shutdown') {
        console.info('Shutdown message received');
    }
})

process.on('exit', () => {
    console.info('Received exit signal');
})

其中我后来读到这仅适用于 Linux 而不适用于 Windows。在 Windows 上,建议的解决方案是:

var rl = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on("SIGINT", function () {
    console.info('Inside readline SIGNINT')
    process.emit("SIGINT");
});

rl.on('SIGTERM', function () {
    console.info('Inside readline SIGTERM')
    process.emit('SIGTERM')
});

rl.on('message', function (msg) {
    console.info('Inside readline message')
    process.emit(msg);
})

但不幸的是,这也不起作用。我实际上不知道如何解决这个问题。当我使用命令行命令node server.js运行 server.js 时,我可以看到它确实使用上面的代码正确捕获了信号。

有人知道这里会发生什么吗?我也尝试将 PM2 版本升级到最新版本(3.2.3),但也无济于事。

更新

我在pm2.log中看到的是重复打印的一行:

2018-12-13T11:07:43: PM2 log: App [PROXY:0] exited with code [1] via signal [SIGINT]

这表明我的 NodeJS 服务器没有正确关闭,但我似乎也无法从中得到错误,因为它在从 CMD 运行时可以工作。

标签: node.jsexpressprocesspm2

解决方案


推荐阅读