javascript - 如何在 Node.js 中捕获 * 并忽略 * SIGINT?

标签 javascript node.js sigint

我在相关主题(How to perform an async operation on exit)上找到了另一篇文章,但它可能不适用于 macOS,或者在运行 Node.js v14 时不再适用。
我原来的问题更复杂。我无法获得 setTimeout s 或 await在 SIGINT 的回调(或异步回调)中正常工作。但后来我意识到我真正需要做的,首先是能够捕捉和忽略 SIGINT。
如果我能做到这一点,那么我也可以关闭以响应 SIGINT,如果我愿意的话。
所以我回到基础,看看我是否可以简单地禁用 SIGINT。我不能。
我可以检测到 SIGINT,我可以使用控制台消息或任何其他同步代码进行响应,但是无论我做什么,我的代码都会关闭,并且很快就会关闭。

process.on('SIGINT', () => { console.log('here'); return false; });
process.on('SIGINT', () => { console.log('here'); return true; });
process.on('SIGINT', () => { console.log('here'); return undefined; });
process.on('SIGINT', () => { console.log('here'); return new Promise(resolve => { console.log(resolve); }); });
这些方法都不能阻止我的 Node.js 服务器在按下 Ctrl+C 或以其他方式向进程发送 SIGINT 后关闭。
更新:
当我通过 node app.js 运行我的服务器时, SIGINT 拦截正常工作!
显然我已经被一个通过 nodemon 间接运行我的服务器应用程序的工件逼疯了。 .无法正确捕获来自我的 IDE 终端的 Ctrl+C 或使用 IDE 的图形红色🟥(停止)按钮发送的中断,因为生成的信号确实被发送到 nodemon。然而,在 IDE 环境之外,如果没有 nodemon 解决问题,我的优雅关闭可以按我的意愿工作。

最佳答案

如果您观察到这种意外关机行为,总是会想“谁在发送什么信号?”。
根据操作系统和其他进程,可能会发送许多其他信号,例如参见 How does SIGINT relate to the other termination signals such as SIGTERM, SIGQUIT and SIGKILL? .
在您的情况下,最有可能发生的是 nodemon进程正在发送 SIGKILLSIGINT 之后.存在几个不能中止的此类信号。nodemon允许通过 --signal 控制默认终止信号,见 https://github.com/remy/nodemon/blob/master/doc/cli/options.txt .nodemon也可以通过本地和全局配置文件进行配置,参见 https://github.com/remy/nodemon/blob/master/doc/cli/config.txt .

关于javascript - 如何在 Node.js 中捕获 * 并忽略 * SIGINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68787650/

相关文章:

bash - 无法在后台 shell 中捕获 SIGINT 信号

node.js - Nestjs 存储库模式配置挑战

javascript - node.js 中的二进制结构

javascript - 从redis集中获取随机元素而不重复

c - SIGINT 半阻塞可能吗?

javascript - 带有 Express 的 Node.js - 返回指向 .CSV 文件的链接而不是下载它

javascript - 如何将不同大小的元素放在一页中,避免它们之间有太多间隙?

javascript - 使用 Canvas 和范围输入事件的动态图像过滤器

javascript - 了解Redux生命周期,(初始ajax加载不起作用)

python - 我可以将 SIGINT 发送到 Windows 上的 Python 子进程吗?