Node.js Process

Node.js process 全局对象的核心 API:命令行参数、环境变量、退出码、信号处理、内存使用。

#type / concept #status / growing #tech / dev / backend #resource / nodejs #resource / javascript

[!info] related notes

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() 改变工作目录:影响所有相对路径
创建于 2026/5/27 更新于 2026/5/27