• Node.js Video Tutorials

Node.js - 进程



Node.js 中的 process 对象是一个全局对象,尽管它是在 process 模块中定义的。它是一个 EventEmitter 类的实例。process 对象提供有关当前 Node.js 进程的信息。借助与此对象关联的许多方法和属性,可以控制当前的 Node.js 进程。

进程事件

process 对象是 EventEmitter 的一个实例,并发出以下事件:

序号 事件 & 描述
1

exit

当进程即将退出时发出。此时无法阻止事件循环退出,并且一旦所有 exit 监听器运行完毕,进程将退出。

2

beforeExit

当 Node.js 清空其事件循环并且没有其他内容要调度时发出此事件。通常,当没有计划工作时,Node.js 会退出,但是 'beforeExit' 的监听器可以进行异步调用,并导致 Node.js 继续运行。

3

uncaughtException

当异常冒泡回事件循环时发出。如果为该异常添加了监听器,则不会发生默认操作(即打印堆栈跟踪并退出)。

4

warning

每当 Node.js 发出进程警告时,都会发出 'warning' 事件。进程警告类似于错误,因为它描述了需要提请用户注意的异常情况。

5

信号事件

当进程收到信号(例如 SIGINT、SIGHUP 等)时发出。

示例

在以下代码中,process 对象的 beforeExit 事件与一个回调箭头函数相关联。类似地,exit 事件调用另一个回调函数。beforeExit 上的函数首先运行,然后是 exit 事件上的函数。

process.on('beforeExit', (code) => {
   console.log('A beforeExit event occured with code: ', code);
});

process.on('exit', (code) => {
   console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');

输出

This message is displayed first.
A beforeExit event occured with code:  0
Process exit event with code:  0

注意 监听器函数只能执行同步操作。Node.js 进程将在调用 'exit' 事件监听器后立即退出,导致事件循环中仍排队的任何其他工作被放弃。例如,在以下示例中,超时将永远不会发生:

示例

process.on('exit', function(code) {
   // Following code will never execute.
   setTimeout(function() {
      console.log("This will not run");
   }, 0);
   
   console.log('About to exit with code:', code);
});
console.log("Program Ended");

输出

Program Ended
About to exit with code: 0

进程方法

abort()

abort() 方法立即终止当前进程,然后创建一个核心文件。

示例

以下程序每隔一秒钟向控制台打印一条消息,并在 5 秒后终止循环,因为调用了 abort() 函数。

const abortfunction = () => { 
   console.log('Start...'); 
  
   // It prints the message after every 1 second 
   setInterval((function() { 
      return console.log('Hello World'); 
   }), 1000); 
  
   // It calls process.abort() after 5 seconds 
   setTimeout((function() { 
      return process.abort(); 
   }), 5000); 
}; 
  
abortfunction();
输出
Start...
Hello World
Hello World
Hello World
Hello World

终止后会输出一个较长的核心文件。

chdir()

此方法更改 Node.js 进程的当前工作目录,或者如果这样做失败(例如,如果指定的目录不存在),则抛出异常。

cwd()

process.cwd() 方法返回 Node.js 进程的当前工作目录。

示例

console.log(`Starting directory: ${process.cwd()}`);
try {
   process.chdir('NewNodeApp');
   console.log(`New directory: ${process.cwd()}`);
} catch (err) {
   console.error(`chdir: ${err}`);
}
输出
Starting directory: D:\nodejs
New directory: D:\nodejs\NewNodeApp

如果找不到目录,则输出如下:

Starting directory: D:\nodejs
chdir: Error: ENOENT: no such file or directory, chdir 'D:\nodejs' -> 'NewDir'

exit()

此方法以代码 exit 状态同步终止当前进程(默认为 'success' 代码 0)。Node.js 只有在所有 'exit' 事件监听器都被调用后才会终止。

示例

console.log('Code running'); 
process.on('exit', function(code) { 
   return console.log(`exiting with the error code : ${code}`); 
}); 
setTimeout((function() { 
   return process.exit(0); //after 5 sec
}), 5000);
输出
Code running
exiting with the error code : 0

kill()

此方法终止当前进程并向由 pid 标识的进程发送信号。

kill(pid[, signal])

参数

pid:进程 ID

signal:要发送的信号,可以是字符串或数字。默认值:'SIGTERM'。

信号名称是字符串,例如 'SIGINT' 或 'SIGHUP'。

示例

以下代码获取当前进程的 pid。它等待足够长的时间,然后正常退出。在此期间,如果您通过按 ctrl-C 发出 SIGINT 信号,则进程不会终止。

const pid = process.pid;
console.log(`Process ID: ${pid}`); 
process.on('SIGHUP', () => console.log('Received: SIGHUP')); 
process.on('SIGINT', () => console.log('Received: SIGINT')); 
setTimeout(() => {}, 100000); // keep process alive 
setTimeout((function() { 
   return process.kill(pid, 'SIGINT'); //after 5 sec
}), 5000);

终端在每次按下 ctrlC 时显示进程 ID 和 Received: SIGINT。在另外 5 秒的超时后,调用 kill() 方法,该方法终止进程

Process ID: 1776
Received: SIGINT

memoryUsage()

此函数返回一个对象,该对象以字节为单位描述 Node.js 进程的内存使用情况。

示例

console.log(process.memoryUsage());
输出
{
  rss: 24768512,
  heapTotal: 4079616,
  heapUsed: 3153848,
  external: 1097184,
  arrayBuffers: 10519
}

nextTick()

此函数将回调函数的执行推迟到下一个事件循环迭代。

nextTick(callback[, ...args])

此函数是 Node.js 异步 API 中事件循环的重要组成部分。在 Node.js 中,事件循环的每次迭代都称为一个 tick。要安排回调函数在事件循环的下一次迭代中被调用,我们使用 process.nextTick()。

示例

console.log('start');
process.nextTick(() => {
   console.log('nextTick callback executed in next iteration');
});
console.log('scheduled');
输出
start
scheduled
nextTick callback executed in next iteration

进程属性

process.arch

编译 Node.js 二进制文件的操作系统 CPU 架构。

可能的值为:

  • 'arm',

  • 'arm64',

  • 'ia32',

  • 'loong64',

  • 'mips',

  • 'mipsel',

  • 'ppc',

  • 'ppc64',

  • 'riscv64',

  • 's390',

  • 's390x',

  • 'x64'

示例

console.log(`This processor architecture is ${process.arch}`);
输出
This processor architecture is x64

process.argv

此属性返回一个数组,其中包含启动 Node.js 进程时传递的命令行参数。您可以将参数传递到要从命令行执行的脚本中。这些参数存储在一个数组 process.argv 中。数组中的第 0 个元素是 node 可执行文件,第一个元素是 JavaScript 文件,后面跟着传递的参数。

将以下脚本另存为 hello.js 并从命令行运行它,从命令行向其传递一个字符串参数。

const args = process.argv;

console.log(args); 

const name = args[2];

console.log("Hello,", name);

在终端中,输入

PS D:\nodejs> node hello.js TutorialsPoint
[ 'C:\\nodejs\\node.exe', 'c:\\nodejs\\a.js', 'TutorialsPoint' ]
Hello, TutorialsPoint

process.env

属性返回一个包含环境变量的对象。

示例

const processEnvKeys = Object.keys(process.env);

processEnvKeys.forEach((key) => {
   console.log(`${key}: ${process.env[key]}`);
});
输出
SystemDrive: C:
SystemRoot: C:\WINDOWS
TEMP: C:\Users\mlath\AppData\Local\Temp
TMP: C:\Users\mlath\AppData\Local\Temp
USERDOMAIN: GNVBGL3
USERDOMAIN_ROAMINGPROFILE: GNVBGL3
USERNAME: mlath
USERPROFILE: C:\Users\mlath
windir: C:\WINDOWS
ZES_ENABLE_SYSMAN: 1
TERM_PROGRAM: vscode
TERM_PROGRAM_VERSION: 1.84.2
LANG: en_US.UTF-8
COLORTERM: truecolor
VSCODE_INJECTION: 1
VSCODE_NONCE: b8069509-e0f5-4bbd-aac9-fc448279b154

您还可以从命令行设置环境变量。在 node 可执行文件名之前为一个或多个变量赋值。

USER_ID=101 USER_NAME=admin node app.js

在脚本内部,环境变量作为 process.env 对象的属性可用

process.env.USER_ID; // "101"
process.env.USER_NAME; // "admin"

process.pid

属性返回进程的 PID。

示例

const { pid } = require('node:process');

console.log(`This process is pid ${pid}`);
输出
This process is pid 16312

process.platform

此属性返回一个字符串,用于标识操作系统。

可能的值为:

  • 'aix'

  • 'darwin'

  • 'freebsd'

  • 'linux'

  • 'openbsd'

  • 'sunos'

  • 'win32'

process.version

此属性包含 Node.js 版本字符串。

示例

console.log(`Version: ${process.version}`);
输出
Version: v20.9.0
nodejs_global_objects.htm
广告