last-words v1.0.0
Last Words
Run some (cleanup) code before the process exits.
Listens to:
['SIGTERM', 'SIGINT', 'SIGQUIT', 'SIGHUP', 'SIGBREAK']cb(false)- Node exits when event loop is emptied
uncaughtExceptionMonitorcb(true, err)onuncaughtException(andunhandledRejectionbased on--unhandled-rejectionsflag)- Node logs the error to
stderrand exits
exitcb(true)- Node exits
Usage
const onExit = require('last-words')
onExit((
abort, // true / false
err // instanceof Error when `uncaughtException`/`unhandledRejection`
) => {
if (abort) {
// only perform sync tasks
} else {
// can perform async tasks
}
})Considerations
It does not explicitly kill the process and will be terminated by Node when the event loop is emptied. Therefore, if you forget to cleanup some holding processes, it will not be terminated.
If the process is killed with "preventable" signals (other than e.g.
SIGKILLor explicitprocess.exit()), the callback will be invoked twice. Once withabort = falseand again withabort = true. An exception isuncaughtException/unhandledRejection- those will callback twice withabort = true
Alternatives and differences
It calls a hook on exiting when there is time for async cleanup and when there is not and let Node exit naturally. If there is something still holding the process, it doesn't timeout, thus allowing spotting developer bugs.
There are alternatives out there developed to tackle the same task. Most of them
are either not maintained anymore, an overkill with functionality, exits the
process explicitly or handles and prevents uncaughtException by default.
- calls
process.exitexplicitly - custom hooks
- async timeout
uncaughtException/unhandledRejectionhooks (can not opt-out)- hooks cleanup functionality
- calls
- calls
process.exitexplicitly - custom hooks
- async timeout
uncaughtException/unhandledRejectionhooks- hooks cleanup functionality
- calls
- calls
process.exitexplicitly uncaughtExceptionhook (can not opt-out)- custom hooks
- custom
stderrmessages
- calls
uncaughtExceptionhook
5 years ago