Node.js中常见进程信号包括SIGINT(用户中断,如Ctrl+C)、SIGTERM(请求终止,用于优雅停机)、SIGHUP(重新加载配置)、SIGUSR1/SIGUSR2(自定义用途)、SIGKILL(强制终止,不可捕获)和SIGSTOP(暂停进程,不可捕获)。其中,SIGINT和SIGTERM可用于实现优雅停机,通过监听这些信号,停止接收新请求、完成现有任务、清理资源后安全退出;而SIGHUP和SIGUSR1/2可扩展用于热重载或状态监控等场景。处理时需避免阻塞操作、慎用process.exit()、设置超时机制,并统一管理退出逻辑,确保应用在容器化环境中稳定运行。

Node.js中操作进程信号主要通过内置的
process
SIGINT
SIGTERM
在Node.js中,要处理进程信号,最直接的方式就是使用
process.on()
SIGINT
SIGTERM
kill
在Node.js的世界里,我们与操作系统打交道,进程信号就是操作系统和我们应用之间的一种“悄悄话”。了解这些信号,对于构建健壮的Node.js应用来说,我觉得是基础中的基础。
SIGINT
Ctrl+C
SIGINT
SIGTERM
kill
SIGINT
SIGTERM
SIGHUP
SIGHUP
SIGUSR1
SIGUSR2
SIGKILL
SIGKILL
SIGKILL
SIGSTOP
SIGCONT
SIGSTOP
我个人觉得,对
SIGINT
SIGTERM
SIGHUP
SIGUSR*
优雅停机,说白了就是让你的应用在被要求退出时,能把手头的工作做完,把该关的都关掉,再体面地离开。这听起来简单,但实际操作起来,尤其是在异步的世界里,还是有些门道的。
如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld
0
一个典型的Node.js应用,在收到
SIGINT
SIGTERM
server.close()
这是一个简单的实现示例:
const http = require('http');
let connections = new Set(); // 用于追踪所有活跃的连接
const server = http.createServer((req, res) => {
// 模拟一个需要一些时间处理的请求
setTimeout(() => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello Node.js Graceful Shutdown!\n');
}, 500); // 假设处理需要500ms
});
server.on('connection', connection => {
connections.add(connection);
connection.on('close', () => connections.delete(connection));
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
// 优雅停机逻辑
const gracefulShutdown = () => {
console.log('Received kill signal, shutting down gracefully...');
// 1. 停止接受新的请求
server.close(() => {
console.log('Closed out remaining connections.');
// 2. 所有连接都已关闭,可以安全退出
process.exit(0);
});
// 如果有活跃连接,给它们一些时间完成
// 否则,server.close()会立即回调
if (connections.size > 0) {
console.log(`Waiting for ${connections.size} connections to close...`);
// 设置一个超时,防止某些连接永远不关闭
setTimeout(() => {
console.warn('Forcefully shutting down due to timeout. Not all connections closed.');
connections.forEach(conn => conn.destroy()); // 强制关闭剩余连接
process.exit(1); // 退出码非0表示非正常退出
}, 10000); // 10秒超时
} else {
// 如果没有活跃连接,直接退出
process.exit(0);
}
};
// 监听终止信号
process.on('SIGTERM', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);
// 监听未捕获的异常,这也很重要,避免应用在意外情况下崩溃
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
// 在生产环境中,这里通常会记录错误并尝试优雅退出
// 但为了避免进程卡死,有时会选择立即退出或在短暂清理后退出
gracefulShutdown();
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// 同样,这里也应该进行错误记录和优雅退出
gracefulShutdown();
});这里我用了一个
Set
server.close()
处理进程信号这事儿,看似简单,但实际操作中还是有些坑需要避开,也有一些实践能让你的应用更稳健。
process.exit()
process.exit()
process.exit()
process.exit()
gracefulShutdown
process.exit(0)
process.exit(1)
uncaughtException
unhandledRejection
SIGTERM
SIGTERM
SIGTERM
SIGKILL
process.on('SIGTERM', handler)SIGTERM
process.removeListener()
以上就是Node.js中如何操作进程信号?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号