chore: Add the process tree destroyer

This commit is contained in:
J H
2024-03-06 15:43:07 -07:00
parent 8410929e86
commit f3ccad192c
3 changed files with 49 additions and 6 deletions

View File

@@ -137,6 +137,7 @@ export class Daemons<Manifest extends SDKManifest, Ids extends string> {
}
return {
async term(options?: { signal?: Signals; timeout?: number }) {
console.error("Bluj Daemons term")
await Promise.all(
Object.values<Promise<DaemonReturned>>(daemonsStarted).map((x) =>
x.then((x) => x.term(options)),
@@ -144,6 +145,7 @@ export class Daemons<Manifest extends SDKManifest, Ids extends string> {
)
},
async wait() {
console.error("Bluj Daemons wait")
await Promise.all(
Object.values<Promise<DaemonReturned>>(daemonsStarted).map((x) =>
x.then((x) => x.wait()),

View File

@@ -254,11 +254,21 @@ export const createUtils = <
})
})
const pid = childProcess.pid
return {
wait() {
return answer
async wait() {
const pids = pid ? await psTree(pid, overlay) : []
try {
return await answer
} finally {
for (const process of pids) {
overlay.exec(["kill", `-9`, String(process)])
}
}
},
async term({ signal = SIGTERM, timeout = NO_TIMEOUT } = {}) {
const pids = pid ? await psTree(pid, overlay) : []
console.error("Bluj killing pid ", pids)
try {
childProcess.kill(signal)
@@ -269,13 +279,26 @@ export const createUtils = <
),
answer.then(() => false),
])
if (didTimeout) childProcess.kill(SIGKILL)
return
if (didTimeout) {
childProcess.kill(SIGKILL)
}
} else {
await answer
}
await answer
} finally {
await overlay.destroy()
}
console.error("Bluj actually killing pid ", pids)
try {
for (const process of pids) {
await overlay.exec(["kill", `-${signal}`, String(process)])
}
} finally {
for (const process of pids) {
overlay.exec(["kill", `-9`, String(process)])
}
}
},
}
},
@@ -294,3 +317,11 @@ export const createUtils = <
}
}
function noop(): void {}
async function psTree(pid: number, overlay: Overlay): Promise<number[]> {
const { stdout } = await overlay.exec(["pstree", `-p`, String(pid)])
const regex: RegExp = /\((\d+)\)/g
return [...stdout.toString().matchAll(regex)].map(([_all, pid]) =>
parseInt(pid),
)
}