我正试图找到一种方法,在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()
})
参考Signals Deno STD文件。
在调查同一件事时遇到了这个!使用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
一起运行。