信号事件
🌐 Signal events
当 Node.js 进程收到信号时,将会发出信号事件。请参阅 signal(7) 以查看标准 POSIX 信号名称的列表,例如 'SIGINT'、'SIGHUP' 等。
🌐 Signal events will be emitted when the Node.js process receives a signal. Please
refer to signal(7) for a listing of standard POSIX signal names such as
'SIGINT', 'SIGHUP', etc.
Worker 线程上没有信号。
🌐 Signals are not available on Worker threads.
信号处理程序将接收信号的名称(如 'SIGINT'、'SIGTERM' 等)作为第一个参数。
🌐 The signal handler will receive the signal's name ('SIGINT',
'SIGTERM', etc.) as the first argument.
每个事件的名称将是信号的常用大写名称(例如,SIGINT 信号对应 'SIGINT')。
🌐 The name of each event will be the uppercase common name for the signal (e.g.
'SIGINT' for SIGINT signals).
import process from 'node:process';
// Begin reading from stdin so the process does not exit.
process.stdin.resume();
process.on('SIGINT', () => {
console.log('Received SIGINT. Press Control-D to exit.');
});
// Using a single function to handle multiple signals
function handle(signal) {
console.log(`Received ${signal}`);
}
process.on('SIGINT', handle);
process.on('SIGTERM', handle);const process = require('node:process');
// Begin reading from stdin so the process does not exit.
process.stdin.resume();
process.on('SIGINT', () => {
console.log('Received SIGINT. Press Control-D to exit.');
});
// Using a single function to handle multiple signals
function handle(signal) {
console.log(`Received ${signal}`);
}
process.on('SIGINT', handle);
process.on('SIGTERM', handle);'SIGUSR1'被 Node.js 保留用来启动 调试器。可以安装一个监听器,但这样做可能会干扰调试器。'SIGTERM'和'SIGINT'在非 Windows 平台上有默认处理程序,它们会在退出时以代码128 + 信号编号重置终端模式。如果给其中一个信号安装了监听器,其默认行为将被移除(Node.js 将不再退出)。- 默认情况下会忽略
'SIGPIPE'。可以为其安装监听器。 - 在 Windows 上,当控制台窗口关闭时会生成
'SIGHUP',在其他平台下也会在各种类似情况下生成。请参见signal(7)。可以安装监听器,但是 Windows 会在大约 10 秒后无条件终止 Node.js。在非 Windows 平台上,SIGHUP的默认行为是终止 Node.js,但一旦安装了监听器,其默认行为将被移除。 'SIGTERM'在 Windows 上不受支持,但可以监听它。- 来自终端的
'SIGINT'在所有平台上都受支持,通常可以通过 Ctrl+C 生成(尽管这可能是可配置的)。当启用 终端原始模式 并使用 Ctrl+C 时,它不会被生成。 'SIGBREAK'在 Windows 上会在按下 Ctrl+Break 时触发。在非 Windows 平台上,可以监听它,但没有办法发送或生成它。'SIGWINCH'会在控制台尺寸改变时发送。在 Windows 上,这只会在控制台写入时发生,前提是光标正在移动,或者在使用原始模式的可读 tty 时发生。'SIGKILL'无法安装监听器,它将在所有平台上无条件终止 Node.js。'SIGSTOP'不能安装监听器。'SIGBUS'、'SIGFPE'、'SIGSEGV'和'SIGILL',当不是通过kill(2)人为触发时,本质上会使进程处于一个不安全的状态,此时调用 JS 监听器是不安全的。这样做可能会导致进程停止响应。0可以用于测试进程是否存在,如果进程存在则不会有任何作用,但如果进程不存在则会抛出错误。
Windows 不支持信号,因此没有与信号终止相对应的功能,但 Node.js 提供了一些通过 process.kill() 的模拟,以及 subprocess.kill():
🌐 Windows does not support signals so has no equivalent to termination by signal,
but Node.js offers some emulation with process.kill(), and
subprocess.kill():
- 发送
SIGINT、SIGTERM和SIGKILL会导致目标进程被无条件终止,之后,subprocess 将报告该进程已被信号终止。 - 发送信号
0可作为一种平台无关的方法来测试进程是否存在。