Deno和Docker如何监听SIGTERM信号并关闭服务器

3
我正在尝试寻找一种方法,在Deno中监听Docker SIGTERM信号以关闭我的Oak服务器。我从Oak网站得到了这段代码,当我使用setTimeout或端点调用controller.abort()函数时,它可以正常工作。然而,我想在收到Docker SIGTERM信号时调用它,但我无法弄清楚如何监听。
const controller = new AbortController();
const app = new Application();

app.addEventListener("listen", ({ hostname, port }) => {
  console.log(
    bold("Start listening on ") + yellow(`${hostname}:${port}`),
  );
});

// Utilise the signal from the controller
const { signal } = controller;
await app.listen({ hostname: "127.0.0.1", port: 8000, signal });
console.log(bold("Finished."));

我尝试使用来自Deno GitHub讨论的这段代码,但也没有起作用。

(() => {
  for await (const _ of Deno.signal(Deno.Signal.SIGINT)) {
    console.log("interrupt signal")
  }
})()
(() => {
  for await (const _ of Deno.signal(Deno.Signal.SIGQUIT)) {
    console.log("quit signal")
  }
})()
(() => {
  for await (const _ of Deno.signal(Deno.Signal.SIGTERM)) {
    console.log("terminate signal")
  }
})()

我既不能看到日志,也没有调用中止操作

2个回答

1

在研究同样的事情时发现了这个!有一个相对较新的不稳定功能,可以使用addSignalListener添加监听器。

一个适用于Oak的工作示例:

import { Application } from "https://deno.land/x/oak/mod.ts";

const controller = new AbortController();
const app = new Application();

app.use(() => void console.log('hello!'));
app.listen({port: 8080, signal: controller.signal});

Deno.addSignalListener('SIGTERM', () => {
  console.log('Aborting for SIGTERM')
  controller.abort();
});

Deno.addSignalListener('SIGINT', () => {
  console.log('Aborting for SIGINT')
  controller.abort();
});

可以使用deno run --unstable --allow-net <file>.ts来运行。


1
你的方向是正确的,但你可以简化你的解决方案。
我的应用服务器处理程序示例。我正在使用Opine,但它可以通过粘贴到服务器初始化的任何位置进行适应。你也可以尝试将其插入到监听器中。
const handle = onSignal(Deno.Signal.SIGTERM, () => {
  mongoConnector.close()
  handle.dispose()
})

参考信号 Deno STD文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接