首页 > 解决方案 > Heroku 应用程序立即终止,而不是通过 SIGTERM 正常关闭

问题描述

我试图通过处理 TERM 信号让 Heroku 上的 Nodejs 应用程序正常关闭。我在这里按照示例进行操作:

https://help.heroku.com/D5GK0FHU/how-can-my-node-app-gracefully-shutdown-when-receiving-sigterm

当我在本地运行应用程序时,我会看到以下输出:

Listening
tick
tick
tick
tick

然后当我终止进程时,我看到:

SIGTERM...
SIGTERM
tick
tick
tick
tick
tick
...waited 5s, exiting.

因此,应用程序收到 SIGTERM 信号,等待 5 秒然后退出。正如预期的那样。

但是,当我在 Heroku 上运行相同的应用程序并停止它时,heroku stop我在日志中看到:

2021-03-11T04:07:19.772390+00:00 app[web.1]: tick
2021-03-11T04:07:20.773763+00:00 app[web.1]: tick
2021-03-11T04:07:21.774183+00:00 app[web.1]: tick
2021-03-11T04:07:22.286757+00:00 heroku[web.1]: State changed from up to down
2021-03-11T04:07:22.775526+00:00 app[web.1]: tick
2021-03-11T04:07:23.094486+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2021-03-11T04:07:23.147570+00:00 app[web.1]: SIGTERM...
2021-03-11T04:07:23.148402+00:00 app[web.1]: SIGTERM
2021-03-11T04:07:23.200434+00:00 heroku[web.1]: Process exited with status 143

所以在这里它看起来像我的应用程序正在接收 SIGTERM 信号并试图等待。然后该进程立即被 Heroku 杀死。似乎该过程没有获得 30 秒的宽限超时来完成其工作。当我这样做heroku restart或通过推送到 repo 隐式重新启动测功机时,也会发生同样的事情。

根据这篇文章,这个过程应该有 30 秒来完成它的工作:

https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm

为什么我的流程没有获得记录的 30 秒来完成其工作?

我能想到的几个原因:

  1. 我正在使用免费的测功机,不支持此功能。但是,我在文档中没有找到任何关于此的内容。如果是这种情况,它记录在哪里?

  2. 我需要在某个地方进行设置。但我还没有看到任何这样的设置,也没有找到任何关于它的文档。如果是这种情况,设置是什么?它记录在哪里?

谢谢!

标签: node.jsherokusigterm

解决方案


推荐阅读