PM2 如何优雅地关闭 Node.js 进程

阅读时长 4 分钟读完

前言

Node.js 是 JavaScript 在服务器端的运行环境,具有轻量快速、事件驱动、高效利用 I/O 等优点,逐渐成为了 Web 和移动应用后台开发中的主要选择。随着 Node.js 应用的不断增长,相关工具和框架也在逐渐涌现,PM2 便是其中之一。

PM2 是一个进程管理器,其主要功能是管理 Node.js 进程,包括进程守护、负载均衡、进程监控等。在实际使用过程中,我们有时候需要优雅地关闭 Node.js 进程,PM2 也提供了相应的方法,本文将对其进行详细介绍。

什么是优雅关闭

你可能不止一次地听说过优雅关闭(graceful shutdown)这个词汇,不过如果你没有具体了解过其工作方式和原理,这里简要地介绍一下。

当我们使用 Unix (或 Linux) 操作系统时,系统总是在关闭进程时先发送一个 TERM 信号(signal),这是为了让程序结束前先进行一些清理工作,如释放内存、关闭文件、断开连接等,保证进程退出的平稳性和稳定性。之后系统会再发送一个 KILL 信号来强制结束进程,尤其是在 TERM 信号被无法响应或消息队列中存在残留消息的情况下,这个过程往往会对运维人员造成麻烦。

在 Node.js 进程中,我们希望能够使用类似的方式来实现进程的优雅关闭,以确保进程不会在关闭时导致不完全执行或遗留一些垃圾数据等问题。

PM2 如何实现优雅关闭

在 PM2 中,通常有两种关闭 Node.js 进程的方式,一种是使用命令来手动关闭,另一种是使用 API 自动关闭,在这里我们将介绍两种关闭方式的实现方法。

手动关闭 Node.js 进程

手动关闭 Node.js 进程通常使用 pm2 stop 命令来完成,该命令会首先发送 TERM 信号,等待所有进程关闭和清理,最后再发送 KILL 信号来强制结束残余进程。虽然这种关闭方式在大多数情况下都能够完成进程的平稳结束,但如果你需要进行更多的清理工作,该方法就有些力不足了。

为了解决这个问题,我们可以使用 pm2 gracefulReload 命令来进行优雅关闭。gracefulReload 实际上是 PM2 提供的一种重新加载进程的方式,但在实现过程中,它会发送 TERM 信号并等待进程完成清理工作,完成后再加载新的进程实例。这样就可以保证进程不会在关闭时发生一些不必要的错误或遗留未处理的数据。

自动关闭 Node.js 进程

除了手动关闭之外,我们也可以使用 PM2 的 API 自动关闭 Node.js 进程。这种方式可以通过 pm2.disconnect()process.exit() 两个操作来完成。

具体代码实现请参考下面的示例代码:

-- -------------------- ---- -------
----- --- - ---------------

------ -- -- -
  ----- --------------

  -- ----
  ----- --- ----------------- ------- -- -
    --------------- ----- ---- -- -
      -- ----- -
        ------------
      - ---- -
        -------------
      -
    ---
  ---

  -- ----
  -----------------

  -- ----
  ----------------
-----
展开代码

注意事项

无论是使用 pm2 stop 命令还是使用 gracefulReload 方式,实现优雅关闭都需要满足以下条件:

  1. 代码中需要尽可能恰当地处理并关闭打开的文件、数据库连接和其他资源。PM2 发送 TERM 信号后,正处于执行任务的进程需要自行处理退出前的所有事情,并在事务完成后自动退出。

  2. PM2 需要监听 SIGINT 信号(即键盘 Ctrl + C)来正确地关闭进程。如果进程不会正常响应 SIGINT 信号,可以设置 unref 属性为 true 来让 Node.js 在退出前立即关闭所有异步 IO 的资源,避免长时间卡在关闭的时候无法退出。

结语

在本文中,我们介绍了 Node.js 进程的优雅关闭方式,以及如何在 PM2 环境下实现进程优雅关闭。不管使用哪种方式,我们都需要考虑如何合理使用并释放进程所绑定的资源,避免遗留垃圾数据而引起不必要的麻烦。

感谢您阅读本文,希望对您的开发和学习有所帮助。如有任何问题或建议,欢迎在评论区留言。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b8c8be306f20b3a66ca22a

纠错
反馈

纠错反馈