如何阻止cluster模式下主进程接收的信号向下传播到子进程?
问题解决方案
Node.js 的 cluster 模块默认会将主进程收到的 SIGUSR1 等信号自动转发到所有工作子进程,这是信号扩散到子进程的根本原因,可通过以下两种方式解决:
- 子进程侧忽略
SIGUSR1信号
在子进程逻辑中主动监听SIGUSR1信号,设置空回调覆盖 Node.js 默认的开启调试器逻辑,代码示例如下:
const cluster = require('cluster'); if (cluster.isPrimary) { // 主进程保留SIGUSR1的调试触发逻辑 process.on('SIGUSR1', () => { // 开启 inspector 模式的逻辑,可自行配置端口 require('inspector').open(9229, '127.0.0.1'); }); // 按需启动对应数量的子进程 for (let i = 0; i < require('os').cpus().length; i++) { cluster.fork(); } } else { // 子进程收到SIGUSR1不做任何处理,覆盖默认行为 process.on('SIGUSR1', () => {}); // 原有业务逻辑 }
- 自定义调试触发逻辑
如果你不想用默认的SIGUSR1作为调试触发信号,也可以换用其他自定义信号(比如SIGUSR2),仅在主进程中监听该信号开启调试器,子进程不做对应监听即可,此时发送信号的命令改为kill -SIGUSR2 <主进程PID>。
两种方案都可以避免子进程收到信号后尝试启动调试器导致的端口占用报错,原有调试主进程的操作逻辑不需要做其他调整。
内容的提问来源于stack exchange,提问作者manidos
相关产品推荐
相关产品推荐

