Node.js Process
Node.js process 全局对象的核心 API:命令行参数、环境变量、退出码、信号处理、内存使用。
#type / concept
#status / growing
#tech / dev / backend
#resource / nodejs
#resource / javascript
[!info] related notes
- 所属 MOC: Node.js MOC
- 相关概念: Node.js 事件循环阶段
Node.js Process
一句话定义
process 是 Node.js 的全局对象,提供当前进程的信息和控制能力,无需 require。
命令行参数 process.argv
node app.js --name=test -v
// process.argv 是一个数组
// [0] = node 可执行文件路径
// [1] = 脚本文件路径
// [2...] = 用户传入的参数
console.log(process.argv);
// [
// '/usr/bin/node',
// '/path/to/app.js',
// '--name=test',
// '-v'
// ]
// 推荐用 parseArgs 解析(Node.js 18.3+)
import { parseArgs } from 'node:util';
const { values } = parseArgs({
args: process.argv.slice(2),
options: {
name: { type: 'string' },
verbose: { type: 'boolean', short: 'v' }
}
});
console.log(values.name); // 'test'
console.log(values.verbose); // true
环境变量 process.env
// 读取环境变量(都是字符串)
console.log(process.env.NODE_ENV); // 'production'
console.log(process.env.PORT); // '3000'
// 设置环境变量(仅当前进程及子进程生效)
process.env.DEBUG = 'true';
// 常见模式:带默认值
const port = parseInt(process.env.PORT || '3000', 10);
const isProd = process.env.NODE_ENV === 'production';
// Windows 注意:环境变量名不区分大小写
// Linux/macOS 区分大小写
退出进程
// 正常退出
process.exit(0); // 0 = 成功
// 异常退出
process.exit(1); // 非 0 = 失败
// 推荐:设置 exitCode 后让进程自然退出
// 这样 beforeExit 事件还能触发
process.exitCode = 1;
process.exit(); // 或等事件循环自然结束
// beforeExit:事件循环排空后触发(不能在此安排异步任务)
process.on('beforeExit', (code) => {
console.log('即将退出,退出码:', code);
});
// exit:即将退出时触发(同步,不能阻止退出)
process.on('exit', (code) => {
console.log('退出码:', code);
});
信号处理
// SIGINT:Ctrl+C 触发
process.on('SIGINT', () => {
console.log('收到 SIGINT,优雅退出...');
// 清理资源、关闭连接等
process.exit(0);
});
// SIGTERM:kill 命令默认信号(容器/Docker 常用)
process.on('SIGTERM', () => {
console.log('收到 SIGTERM,关闭服务...');
server.close(() => {
process.exit(0);
});
});
// SIGHUP:终端关闭时发送
process.on('SIGHUP', () => {
console.log('收到 SIGHUP,重新加载配置...');
});
内存使用
// 内存使用情况(单位:字节)
const usage = process.memoryUsage();
console.log({
rss: (usage.rss / 1024 / 1024).toFixed(2) + ' MB', // 进程总内存
heapTotal: (usage.heapTotal / 1024 / 1024).toFixed(2) + ' MB', // V8 堆总量
heapUsed: (usage.heapUsed / 1024 / 1024).toFixed(2) + ' MB', // V8 堆已用
external: (usage.external / 1024 / 1024).toFixed(2) + ' MB', // C++ 对象内存
arrayBuffers: (usage.arrayBuffers / 1024 / 1024).toFixed(2) + ' MB'
});
// 限制堆内存大小
// node --max-old-space-size=4096 app.js (单位 MB)
其他常用 API
// 进程信息
console.log(process.pid); // 进程 ID
console.log(process.ppid); // 父进程 ID
console.log(process.platform); // 'win32', 'linux', 'darwin'
console.log(process.arch); // 'x64', 'arm64'
console.log(process.version); // Node.js 版本
console.log(process.cwd()); // 当前工作目录
console.log(process.uptime()); // 进程运行时间(秒)
// 标准流
process.stdout.write('直接写入标准输出\n');
process.stderr.write('直接写入标准错误\n');
// process.nextTick:微任务,比 Promise 还早
process.nextTick(() => {
console.log('nextTick 回调');
});
优雅退出模板
import http from 'node:http';
const server = http.createServer(handler);
server.listen(3000);
function gracefulShutdown(signal) {
console.log(`收到 ${signal},开始优雅退出...`);
server.close(() => {
console.log('HTTP 服务已关闭');
// 关闭数据库连接等
process.exit(0);
});
// 超时强制退出
setTimeout(() => {
console.error('强制退出');
process.exit(1);
}, 10000);
}
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
常见误区
process.exit()是同步的:不会等待异步操作完成- 环境变量都是字符串:数字需要手动转换
- Windows 和 Linux 的信号不同:
SIGTERM在 Windows 上行为有限 process.chdir()改变工作目录:影响所有相对路径