From 7b83c19da50d0eaa942424a2fa5492e05cde488c Mon Sep 17 00:00:00 2001 From: Sidharth Rathi <58144379+sidwebworks@users.noreply.github.com> Date: Mon, 16 May 2022 20:10:39 +0530 Subject: [PATCH] Support graceful shutdowns (#36909) ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [x] Related issues linked using [19693](https://github.com/vercel/next.js/discussions/19693) - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ x] Make sure the linting passes by running `yarn lint` Closes #29959 --- docs/deployment.md | 23 +++++++++++++++++++++++ packages/next/bin/next.ts | 7 +++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/deployment.md b/docs/deployment.md index 0049dff3e642..e8df934f30ff 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -98,6 +98,29 @@ Next.js will automatically load the latest version of your application in the ba **Note:** If a new page (with an old version) has already been prefetched by `next/link`, Next.js will use the old version. Navigating to a page that has _not_ been prefetched (and is not cached at the CDN level) will load the latest version. +## Manual Graceful shutdowns + +Sometimes you might want to run some cleanup code on process signals like `SIGTERM` or `SIGINT`. + +You can do that by setting the env variable `NEXT_MANUAL_SIG_HANDLE` to `true` and then register a handler for that signal inside your `_document.js` file. + +```js +// pages/_document.js + +if (process.env.NEXT_MANUAL_SIG_HANDLE) { + // this should be added in your custom _document + process.on('SIGTERM', () => { + console.log('Received SIGTERM: ', 'cleaning up') + process.exit(0) + }) + + process.on('SIGINT', () => { + console.log('Received SIGINT: ', 'cleaning up') + process.exit(0) + }) +} +``` + ## Related For more information on what to do next, we recommend the following sections: diff --git a/packages/next/bin/next.ts b/packages/next/bin/next.ts index ad8597d91797..6c4575ff4c5f 100755 --- a/packages/next/bin/next.ts +++ b/packages/next/bin/next.ts @@ -129,8 +129,11 @@ if (process.versions.pnp === '3') { } // Make sure commands gracefully respect termination signals (e.g. from Docker) -process.on('SIGTERM', () => process.exit(0)) -process.on('SIGINT', () => process.exit(0)) +// Allow the graceful termination to be manually configurable +if (!process.env.NEXT_MANUAL_SIG_HANDLE) { + process.on('SIGTERM', () => process.exit(0)) + process.on('SIGINT', () => process.exit(0)) +} commands[command]() .then((exec) => exec(forwardedArgs))