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

问题描述

我试图找到一种方法在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")
  }
})()

我没有看到日志,也没有调用中止

解决方法

您的方向是正确的,但您可以简化您的解决方案。

我的应用程序服务器处理程序的示例。我正在使用 Opine,但可以通过将其粘贴到您的服务器初始化中的任何位置来进行调整。您也可以尝试将其插入监听器。

const handle = onSignal(Deno.Signal.SIGTERM,() => {
  mongoConnector.close()
  handle.dispose()
})

参考信号 Deno STD documentation

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...