Yarn启动Node服务无日志退出:exit code 1问题排查求助
排查Node服务随机退出的额外方法
以下是针对你遇到的问题的进一步排查思路:
捕获进程退出信号
Node服务意外退出可能是收到外部终止信号(如SIGTERM、SIGINT)而非未处理异常,这类信号不会触发uncaughtException或unhandledRejection。添加信号处理器并记录日志:process.on('SIGTERM', () => { console.error('Received SIGTERM signal, service shutting down'); process.exit(1); }); process.on('SIGINT', () => { console.error('Received SIGINT signal, service shutting down'); process.exit(1); });同时启动服务时将所有输出重定向到日志文件,避免遗漏stderr输出:
yarn start 2>&1 > service-full.log排查内存泄漏或OOM问题
内存耗尽导致系统OOM Killer终止进程时,Node不会触发异常处理器,只会直接退出。- 定时输出内存使用情况:
setInterval(() => { const { rss, heapTotal, heapUsed } = process.memoryUsage(); console.log(`Memory Usage - RSS: ${(rss/1024/1024).toFixed(2)}MB, HeapTotal: ${(heapTotal/1024/1024).toFixed(2)}MB, HeapUsed: ${(heapUsed/1024/1024).toFixed(2)}MB`); }, 60000); // 每分钟记录一次 - 查看系统OOM日志:执行
dmesg | grep -i "out of memory",如果存在OOM Killer记录,会显示被终止的进程信息。 - 使用Chrome DevTools的Memory面板分析内存:启动服务时添加
--inspect参数,通过chrome://inspect连接调试。
- 定时输出内存使用情况:
验证依赖与Node版本兼容性
- 切换Node版本:用nvm尝试不同的LTS版本,排查是否是Node版本与依赖包的兼容性问题。
- 检查依赖冲突:执行
yarn why <package-name>查看特定包的依赖链,确认是否存在版本冲突;用yarn audit检查依赖是否有已知漏洞。 - 尝试直接用Node启动:跳过yarn,直接执行
node your-entry-file.js,排除yarn本身的问题。
检查系统资源限制
- 文件描述符限制:执行
ulimit -n查看当前进程允许打开的文件数,若数值过低(如默认的1024),临时调整为ulimit -n 65535,并检查服务是否还会崩溃。 - 监控CPU/内存使用率:用
top或htop实时监控服务进程的资源消耗,确认是否存在CPU占满或内存持续上涨的情况。
- 文件描述符限制:执行
排查Logger自身问题
可能你的日志库在异常发生时无法正常写入日志,暂时替换为console.error测试:process.on('unhandledRejection', (err) => { console.error('[FATAL] Unhandled Rejection:', err.stack || err); process.exit(1); }); process.on('uncaughtException', (err) => { console.error('[FATAL] Uncaught Exception:', err.stack || err); process.exit(1); });若崩溃时控制台有输出,说明原日志库存在问题。
启用Node调试日志
启动服务时添加NODE_DEBUG=*或--trace-warnings参数,让Node输出更多调试信息:NODE_DEBUG=* yarn start # 或 node --trace-warnings your-entry-file.js这些日志可能包含未被捕获的警告或内部错误线索。
内容的提问来源于stack exchange,提问作者Scalahansolo
相关产品推荐
相关产品推荐

