在Node.js服务器中,捕获SIGTERM与捕获SIGINT之间有什么区别吗?
我认为进程不能阻止SIGINT的关闭?
process.once('SIGINT', function (code) {
console.log('SIGINT received...');
server.close();
});
// vs.
process.once('SIGTERM', function (code) {
console.log('SIGTERM received...');
server.close();
});
我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但根据我的阅读,SIGINT总是假设关闭一个过程。
或许我对SIGKILL的SIGINT感到困惑?也许SIGKILL是我无法恢复的信号?
捕获这些信号当然可以让我优雅地关闭:
server.once('close', function(){
// do some other stuff
process.exit(2); // or whatever code pertains
});
我认为SIGINT与SIGKILL混淆 -
如果我尝试这样做:
process.once('SIGKILL', function (code) {
console.log('SIGKILL received...');
exitCode = code || 2;
server.close();
});
我收到此错误:
internal/process.js:206
throw errnoException(err, 'uv_signal_start');
^
Error: uv_signal_start EINVAL
at exports._errnoException (util.js:1022:11)
at process.<anonymous> (internal/process.js:206:15)
at emitTwo (events.js:106:13)
at process.emit (events.js:191:7)
at _addListener (events.js:226:14)
at process.addListener (events.js:275:10)
at process.once (events.js:301:8)
显然你不允许捕获SIGKILL信号,但是你可以捕获SIGINT和SIGTERM吗?
答案 0 :(得分:13)
接受的答案是错误的。
<强> SIGTERM 强> SIGTERM信号被发送到进程以请求终止... SIGINT几乎与SIGTERM相同。
kill
的说明不正确。 你可以捕获它们并仍然可以用SIGKILL关闭进程 - kill -9 pid
那是错的。再次,从wiki上面:
SIGKILL 信号被发送到进程以使其立即终止(kill)。与SIGTERM和SIGINT相反,此信号无法捕获或忽略,接收过程无法在接收到此信号时执行任何清理。
所以,总而言之,
SIGINT几乎与SIGTERM 相同。
答案 1 :(得分:7)
来自https://en.wikipedia.org/wiki/Unix_signal
SIGINT
是由用户按Ctrl+C
生成的,是interrupt
SIGTERM
是发送请求进程终止的信号。 kill命令发送SIGTERM
,它是terminate
您可以抓住这两者,但仍然可以使用SIGKILL
- kill -9 pid