Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sholladay/handle-quit
Support graceful stop in your app
https://github.com/sholladay/handle-quit
deployment pm2 reload server zero-downtime
Last synced: 15 days ago
JSON representation
Support graceful stop in your app
- Host: GitHub
- URL: https://github.com/sholladay/handle-quit
- Owner: sholladay
- License: mpl-2.0
- Created: 2016-09-25T06:20:42.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2019-12-31T04:51:49.000Z (almost 5 years ago)
- Last Synced: 2024-04-14T08:31:04.443Z (7 months ago)
- Topics: deployment, pm2, reload, server, zero-downtime
- Language: JavaScript
- Homepage:
- Size: 22.5 KB
- Stars: 3
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# handle-quit [![Build status for Handle Quit](https://travis-ci.com/sholladay/handle-quit.svg?branch=master "Build Status")](https://travis-ci.com/sholladay/handle-quit "Builds")
> Support [graceful stop](http://pm2.keymetrics.io/docs/usage/signals-clean-restart/#graceful-stop) in your app
Respond to shutdown signals, so a process manager can reload your app without dropping any connections.
## Why?
- Friendly to your users.
- Easy to use and reason about.
- Helps you do easy [zero downtime](https://futurestud.io/tutorials/pm2-cluster-mode-and-zero-downtime-restarts#zerodowntimedeployments) deployments.## Install
```sh
npm install handle-quit --save
```## Usage
Get it into your program.
```js
const handleQuit = require('handle-quit');
```Make sure your program shuts down gracefully or quickly, as necessary.
```js
handleQuit(() => {
server.close();
});
```Note that calling [`process.exit()`](https://nodejs.org/api/process.html#process_process_exit_code) is discouraged. Instead, you should close any server and database connections and let Node exit on its own, which it does automatically when it has no more work left to do.
If you are worried about the process hanging and never cleanly exiting, you are encouraged to use your framework's [stop timeout](https://hapi.dev/api/#server.stop()).
## Use with PM2
To achieve zero downtime deployments, [PM2](https://github.com/Unitech/pm2) needs to shutdown your app without dropping any connections. It sends a [`SIGINT` signal](https://nodejs.org/api/process.html#process_signal_events) to trigger the shutdown process. However, by default, Node reacts to this by exiting immediately, and thus in-progress connections may be dropped.
These problems can be fixed by using `handleQuit()` in the main entry of your CLI or server, as shown above, to override the default `SIGINT` behavior and deny _new_ connections on the first `SIGINT`, while allowing any in-progress connections to finish. This is known as [graceful stop](http://pm2.keymetrics.io/docs/usage/signals-clean-restart/#graceful-stop).
PM2 waits for apps that gracefully stop to quit before replacing them with a new deployment when using `pm2 reload`.
```console
$ pm2 start app.js --kill-timeout 6000
```Just in case something goes wrong, `--kill-timeout` tells PM2 how long it should wait for the process to exit before considering the process hung / frozen, in which case it will force kill the process. You should ensure that `--kill-timeout` is greater than or equal to any stop timeouts used in your app.
To support graceful _start_, see [app-ready](https://github.com/sholladay/app-ready).
## API
### handleQuit(listener)
Listens for [POSIX signals](https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals) (`SIGINT`and `SIGTERM`) and calls the `listener` function on the first signal to perform a graceful shutdown. Calls [`process.exit()`](https://nodejs.org/api/process.html#process_process_exit_code) with an appropriate error code on any further signals that are received to perform an ungraceful shutdown. Relevant messages are also printed to the console.
#### listener
Type: `function`
A function that will gracefully shutdown your program. A common example is [Server#close()](https://nodejs.org/api/http.html#http_server_close_callback).
## Related
- [app-ready](https://github.com/sholladay/app-ready) - Support [graceful start](http://pm2.keymetrics.io/docs/usage/signals-clean-restart/#graceful-start) in your app
## Contributing
See our [contributing guidelines](https://github.com/sholladay/handle-quit/blob/master/CONTRIBUTING.md "Guidelines for participating in this project") for more details.
1. [Fork it](https://github.com/sholladay/handle-quit/fork).
2. Make a feature branch: `git checkout -b my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. [Submit a pull request](https://github.com/sholladay/handle-quit/compare "Submit code to this project for review").## License
[MPL-2.0](https://github.com/sholladay/handle-quit/blob/master/LICENSE "License for handle-quit") © [Seth Holladay](https://seth-holladay.com "Author of handle-quit")
Go make something, dang it.