我想告诉Node.js总是在它退出之前做一些事情,无论出于什么原因- Ctrl+C,一个异常,或任何其他原因。
我试了一下:
process.on('exit', function (){
console.log('Goodbye!');
});
我启动了这个程序,扼杀了它,然后什么都没发生。我再次启动,按下Ctrl+C,仍然什么都没有发生……
我想告诉Node.js总是在它退出之前做一些事情,无论出于什么原因- Ctrl+C,一个异常,或任何其他原因。
我试了一下:
process.on('exit', function (){
console.log('Goodbye!');
});
我启动了这个程序,扼杀了它,然后什么都没发生。我再次启动,按下Ctrl+C,仍然什么都没有发生……
当前回答
只是想在这里提到死亡包:https://github.com/jprichardson/node-death
例子:
var ON_DEATH = require('death')({uncaughtException: true}); //this is intentionally ugly
ON_DEATH(function(signal, err) {
//clean up code here
})
其他回答
在进程由另一个节点进程生成的情况下,例如:
var child = spawn('gulp', ['watch'], {
stdio: 'inherit',
});
然后你试图通过以下方式杀死它:
child.kill();
这是如何处理[子]事件的:
process.on('SIGTERM', function() {
console.log('Goodbye!');
});
这将捕获我能找到的可以处理的每个退出事件。目前看来很可靠,也很干净。
[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`].forEach((eventType) => {
process.on(eventType, cleanUpServer.bind(null, eventType));
})
我需要在退出时做一个异步清理操作,这个问题的答案都不适合我。
所以我自己试了一下,最后发现了这个:
process.once('uncaughtException', async () => {
await cleanup()
process.exit(0)
})
process.once('SIGINT', () => { throw new Error() })
io.js有一个exit和一个beforeExit事件,它们做你想做的事情。
这里有一个针对windows的好方法
process.on('exit', async () => {
require('fs').writeFileSync('./tmp.js', 'crash', 'utf-8')
});