PM2 是一个方便管理 Node.js 进程的工具,但是在使用中也会遇到一些坑点。本文将介绍 PM2 常见的 7 个坑点及解决方案,希望能给前端开发者带来帮助。
坑点一:使用 PM2 启动进程时出现 “error: rejected promise not handled” 错误
这个错误通常是由于在使用 Promise 时没有捕获异常,而 PM2 会在进程退出时将这个错误打印出来。解决方法是在 Promise 中加上 .catch(),这样可以捕获异常并处理。
示例代码:
-- -------------------- ---- ------- -- ---- --- ----------------- ------- -- - -- -- --------- -------------- -- - -- ------ ------ --- -- ---- --- ----------------- ------- -- - -- -- --------- -------------- -- - -- ------ ------ -------------- -- - --------------------- ---
坑点二:PM2 启动后,进程在一段时间内不响应请求
这个问题通常是由于进程在启动时需要加载大量的数据,导致处理请求的速度变慢。解决方法是在启动进程时,在应用的代码中增加延时等待(一般为数秒钟),确保数据加载完成后再开始处理请求。
示例代码:
-- -------------------- ---- ------- -- ------ ----- ------- - ------------------- ----- --- - ---------- -- ---- ------------------ -- - -- ---- ---------------- -- -- - ---------------- --------- -- ---- ------- --- --- -- ------ -------- ---------- - ------ --- ----------------- ------- -- - ------------- -- - ----------------- --------- ---------- -- ------ --- -
坑点三:PM2 启动的进程占用了过多的内存
这个问题通常是由于进程使用了一些内存泄漏的代码,导致内存占用越来越多。解决方法是使用 heapdump 排查内存泄漏,并在代码中定期调用 process.memoryUsage(),记录内存使用情况。
示例代码:
// 定期记录内存使用情况 setInterval(() => { const { rss, heapTotal, heapUsed } = process.memoryUsage(); console.log(`Memory usage: rss=${rss}, heapTotal=${heapTotal}, heapUsed=${heapUsed}`); }, 10000);
坑点四:使用 PM2 启动的进程无法自动重启
这个问题通常是由于进程在启动时,没有正确地监听 SIGINT 或 SIGTERM 信号。解决方法是在进程代码中增加信号监听器,并在收到信号后执行进程退出操作,而不是直接退出进程。
示例代码:
-- -------------------- ---- ------- -- -- ------ - ------- -- -------------------- -- -- - --------------------- ------ ------- -------------- ------- --- -------- ------ - -- ------ ---------------- -
坑点五:PM2 无法正确地处理 unhandledRejection 抛出的异常
这个问题通常是由于 PM2 自身的 bug,导致 unhandledRejection 抛出的异常被误报为未处理的异常。解决方法是在进程代码中增加 unhandledRejection 监听器,并在监听器中打印出异常信息,以便进一步排查。
示例代码:
// 监听 unhandledRejection 异常 process.on('unhandledRejection', (error) => { console.log(`Unhandled rejection: ${error.message}`); });
坑点六:PM2 启动的进程无法正常接收信号
这个问题通常是由于进程在启动时没有正确地绑定信号监听器。解决方法是在进程代码中使用 process.stdin.resume(),以便绑定 SIGINT 或 SIGTERM 信号的监听器。
示例代码:
-- -------------------- ---- ------- -- ------- ----------------------- -- ---- -------------------- -- -- - --------------------- ------ --------- --- --------------------- -- -- - --------------------- ------- --------- ---
坑点七:PM2 监控界面无法正确地显示进程信息
这个问题通常是由于进程没有正确地设置名称(name),导致 PM2 监控界面无法正确地显示进程信息。解决方法是在进程的 ecosystem.config.js 文件中增加 name 字段。
示例代码:
// ecosystem.config.js module.exports = { apps : [{ name: 'my-app', script: 'app.js' }] };
总结
本文介绍了 PM2 常见的 7 个坑点及解决方案,从 Promise 异常处理、进程启动延时、内存泄漏排查、信号监听、异常处理、信号绑定和进程命名等方面,给出了详细的解决方法和示例代码。通过本文的学习,相信读者对 PM2 的使用和排错能力都将有所提高。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647aba0d968c7c53b0664b4f