PM2 如何处理 SIGTERM 信号?

阅读时长 4 分钟读完

在前端开发过程中,我们经常使用 PM2 来管理 Node.js 应用程序。当我们需要关闭/重启应用程序时,我们通常会发送 SIGTERM 信号。但是,当这个信号被发送时,我们应该如何在 PM2 中处理它呢?下面我们来详细了解。

什么是 SIGTERM 信号?

SIGTERM 信号是一个标准的 UNIX 信号,用于请求进程正常终止。当操作系统需要关闭或重启时,通常会发送 SIGTERM 信号给所有正在运行的进程,让它们有时间完成清理工作并正常终止。如果一个进程没有响应 SIGTERM 信号,那么操作系统会发送 SIGKILL 信号将它强制终止。

在 Node.js 应用程序中,我们通常使用 process.exit() 方法来响应 SIGTERM 信号并正常退出。但是,在 PM2 管理的进程中,处理 SIGTERM 信号要更加复杂。

当我们使用 PM2 启动一个 Node.js 应用程序时,它会创建一个进程守护器(watchdog)来监视进程的运行状况。如果进程崩溃或被强制终止,守护器会自动重启它。但是,当我们发送 SIGTERM 信号时,守护器会收到这个信号并尝试优雅地终止进程,并等待进程完成清理工作。如果进程在指定时间内没有退出,守护器就会将其强制终止。

在默认情况下,PM2 会等待 1600ms(或者通过设置 kill_timeout 参数进行配置)来执行优雅退出过程,例如关闭服务器连接、关闭数据库连接、释放资源等。如果到了指定时间内进程没有退出,PM2 就会使用 SIGKILL 信号来强制终止进程。

除了默认的优雅退出过程外,我们还可以通过使用 PM2 提供的 pm2-graceful-exit 模块来定制化退出过程。该模块允许我们在优雅退出期间执行自定义操作,例如等待正在进行的请求完成、保存数据到日志文件等。

示例代码

下面是一个基本的 Node.js 应用程序,该程序可以处理 SIGTERM 信号并正常退出:

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

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

如果我们使用 PM2 启动这个应用程序,我们可以在命令行中发送 SIGTERM 信号来触发优雅退出过程:

当我们发送 pm2 stop app 命令时,PM2 会发送 SIGTERM 信号给应用程序,并等待 1600ms 让其完成清理工作。在这个过程中,我们可以在控制台看到输出:

最后,当应用程序成功退出时,我们可以看到 PM2 输出:

结论

在这篇文章中,我们详细了解了在 PM2 中如何处理 SIGTERM 信号。总结起来,当我们发送 SIGTERM 信号时,PM2 会尝试优雅地终止进程,等待进程完成清理工作并正常退出。如果进程在指定时间内没有退出,PM2 就会使用 SIGKILL 信号来强制终止进程。我们还可以使用 pm2-graceful-exit 模块来定制化优雅退出过程,执行自定义操作。

通过仔细研究和实践,我们可以更好地理解和掌握 PM2 的使用方法,从而更加高效地开发和管理 Node.js 应用程序。

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

纠错
反馈