在前端开发过程中,我们经常使用 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 start app.js pm2 stop app
当我们发送 pm2 stop app
命令时,PM2 会发送 SIGTERM 信号给应用程序,并等待 1600ms 让其完成清理工作。在这个过程中,我们可以在控制台看到输出:
Received SIGTERM signal, shutting down gracefully... HTTP server closed. Database connection closed.
最后,当应用程序成功退出时,我们可以看到 PM2 输出:
[PM2] Process successfully stopped
结论
在这篇文章中,我们详细了解了在 PM2 中如何处理 SIGTERM 信号。总结起来,当我们发送 SIGTERM 信号时,PM2 会尝试优雅地终止进程,等待进程完成清理工作并正常退出。如果进程在指定时间内没有退出,PM2 就会使用 SIGKILL 信号来强制终止进程。我们还可以使用 pm2-graceful-exit
模块来定制化优雅退出过程,执行自定义操作。
通过仔细研究和实践,我们可以更好地理解和掌握 PM2 的使用方法,从而更加高效地开发和管理 Node.js 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64acbac148841e98948ab34f