Node.js 在 heroku 上后台工作者没有正常关闭
Node.js background worker is not gracefully shutting down on heroku
我在 Heroku(简体)上有以下 node.js 工作人员 运行。它是 运行 作为一个工作进程,在单个 dyno 上使用 Procfile
。我期待它以 0
的退出代码正常关闭。但是,它总是以 1
的退出代码退出,甚至不执行完整的关闭功能。
Heroku 为进程提供 30 秒的正常关闭时间(参见 https://devcenter.heroku.com/articles/dynos#shutdown)。
节点版本为 16.13.0
.
在本地它当然很有魅力。
非常感谢任何帮助。
let running = true;
(async function () {
console.log('starting')
while (running) {
console.log('ping')
await new Promise(resolve => setTimeout(resolve, 1000))
}
})()
process.on('SIGTERM', function () {
console.log('received SIGTERM')
console.log('shutting down')
running = false
setTimeout(() => {
console.log('finished shutting down')
process.exit(0)
}, 1000)
})
Heroku 日志:
2021-11-11T17:27:18.884817+00:00 heroku[test-worker.1]: Restarting
2021-11-11T17:27:18.935900+00:00 heroku[test-worker.1]: State changed from up to starting
2021-11-11T17:27:18.831078+00:00 app[test-worker.1]: ping
2021-11-11T17:27:19.594077+00:00 heroku[test-worker.1]: Stopping all processes with SIGTERM
2021-11-11T17:27:19.654762+00:00 app[test-worker.1]: received SIGTERM
2021-11-11T17:27:19.654801+00:00 app[test-worker.1]: shutting down
2021-11-11T17:27:19.786370+00:00 heroku[test-worker.1]: Process exited with status 1
2021-11-11T17:27:22.660423+00:00 heroku[test-worker.1]: Starting process with command `yarn test-worker`
2021-11-11T17:27:23.532721+00:00 heroku[test-worker.1]: State changed from starting to up
2021-11-11T17:27:24.083102+00:00 app[test-worker.1]: yarn run v1.22.17
2021-11-11T17:27:24.133902+00:00 app[test-worker.1]: $ node lib/test-worker/src/index.js
2021-11-11T17:27:24.192198+00:00 app[test-worker.1]: starting
2021-11-11T17:27:24.192700+00:00 app[test-worker.1]: ping
在 Heroku 支持的帮助下,我们能够找出原因是使用 yarn
。显然,yarn
没有等待子进程正常关闭。参见 https://github.com/yarnpkg/yarn/issues/4667。
解决方法是不在 Procfile
中使用 yarn
,而是直接使用 node
。
我在 Heroku(简体)上有以下 node.js 工作人员 运行。它是 运行 作为一个工作进程,在单个 dyno 上使用 Procfile
。我期待它以 0
的退出代码正常关闭。但是,它总是以 1
的退出代码退出,甚至不执行完整的关闭功能。
Heroku 为进程提供 30 秒的正常关闭时间(参见 https://devcenter.heroku.com/articles/dynos#shutdown)。
节点版本为 16.13.0
.
在本地它当然很有魅力。
非常感谢任何帮助。
let running = true;
(async function () {
console.log('starting')
while (running) {
console.log('ping')
await new Promise(resolve => setTimeout(resolve, 1000))
}
})()
process.on('SIGTERM', function () {
console.log('received SIGTERM')
console.log('shutting down')
running = false
setTimeout(() => {
console.log('finished shutting down')
process.exit(0)
}, 1000)
})
Heroku 日志:
2021-11-11T17:27:18.884817+00:00 heroku[test-worker.1]: Restarting
2021-11-11T17:27:18.935900+00:00 heroku[test-worker.1]: State changed from up to starting
2021-11-11T17:27:18.831078+00:00 app[test-worker.1]: ping
2021-11-11T17:27:19.594077+00:00 heroku[test-worker.1]: Stopping all processes with SIGTERM
2021-11-11T17:27:19.654762+00:00 app[test-worker.1]: received SIGTERM
2021-11-11T17:27:19.654801+00:00 app[test-worker.1]: shutting down
2021-11-11T17:27:19.786370+00:00 heroku[test-worker.1]: Process exited with status 1
2021-11-11T17:27:22.660423+00:00 heroku[test-worker.1]: Starting process with command `yarn test-worker`
2021-11-11T17:27:23.532721+00:00 heroku[test-worker.1]: State changed from starting to up
2021-11-11T17:27:24.083102+00:00 app[test-worker.1]: yarn run v1.22.17
2021-11-11T17:27:24.133902+00:00 app[test-worker.1]: $ node lib/test-worker/src/index.js
2021-11-11T17:27:24.192198+00:00 app[test-worker.1]: starting
2021-11-11T17:27:24.192700+00:00 app[test-worker.1]: ping
在 Heroku 支持的帮助下,我们能够找出原因是使用 yarn
。显然,yarn
没有等待子进程正常关闭。参见 https://github.com/yarnpkg/yarn/issues/4667。
解决方法是不在 Procfile
中使用 yarn
,而是直接使用 node
。