处理操作系统信号

⚠️ 在 Deno v1.23 中,Windows 仅支持监听 SIGINT 和 SIGBREAK。

概念

设置操作系统信号监听器

处理操作系统信号的 API 是基于已熟悉的 addEventListener removeEventListener API 示范的。

⚠️ 请注意,监听操作系统信号不会阻止事件循环完成,即使没有未完成的异步操作,进程也将退出。

您可以使用 Deno.addSignalListener() 函数处理操作系统信号:

/**
 * add_signal_listener.ts
 */
console.log("Press Ctrl-C to trigger a SIGINT signal");

Deno.addSignalListener("SIGINT", () => {
  console.log("interrupted!");
  Deno.exit();
});

// 增加一个延迟以防止进程立即退出。
setTimeout(() => {}, 5000);

通过以下方式运行:

deno run add_signal_listener.ts

您可以使用 Deno.removeSignalListener() 函数取消注册先前添加的信号处理程序。

/**
 * signal_listeners.ts
 */
console.log("Press Ctrl-C to trigger a SIGINT signal");

const sigIntHandler = () => {
  console.log("interrupted!");
  Deno.exit();
};
Deno.addSignalListener("SIGINT", sigIntHandler);

// 增加一个延迟以防止进程立即退出。
setTimeout(() => {}, 5000);

// 1s 后停止信号监听。
setTimeout(() => {
  Deno.removeSignalListener("SIGINT", sigIntHandler);
}, 1000);

通过以下方式运行:

deno run signal_listeners.ts

异步迭代器示例

如果您首选使用异步迭代器处理信号,则可以使用 deno_std 中提供的 signal() API:

/**
 * async_iterator_signal.ts
 */
import { signal } from "https://deno.land/std@$STD_VERSION/signal/mod.ts";

const sig = signal("SIGUSR1", "SIGINT");

// 增加一个延迟以防止进程立即退出。
setTimeout(() => {}, 5000);

for await (const _ of sig) {
  console.log("interrupt or usr1 signal received");
}

通过以下方式运行:

deno run async_iterator_signal.ts