fix: graceful ctrl+c shutdown and await session-end memory writes
This commit is contained in:
+34
-2
@@ -540,8 +540,40 @@ export async function startServices(deps: {
|
||||
});
|
||||
|
||||
// Signal handlers
|
||||
const signalHandler = () => {
|
||||
lifecycle.shutdown().then(() => process.exit(0));
|
||||
let shutdownPromise: Promise<void> | null = null;
|
||||
let forceExitArmed = false;
|
||||
const forceExitTimeoutMs = 15_000;
|
||||
|
||||
const signalHandler = (signal: NodeJS.Signals) => {
|
||||
if (shutdownPromise) {
|
||||
if (forceExitArmed) {
|
||||
console.warn(`Second ${signal} received; forcing exit now.`);
|
||||
process.exit(130);
|
||||
}
|
||||
forceExitArmed = true;
|
||||
console.warn(`Shutdown already in progress. Send ${signal} again to force exit.`);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`Received ${signal}; shutting down gracefully...`);
|
||||
shutdownPromise = lifecycle.shutdown();
|
||||
const forceTimer = setTimeout(() => {
|
||||
forceExitArmed = true;
|
||||
console.error(`Graceful shutdown timed out after ${forceExitTimeoutMs / 1000}s; forcing exit.`);
|
||||
process.exit(130);
|
||||
}, forceExitTimeoutMs);
|
||||
forceTimer.unref();
|
||||
|
||||
shutdownPromise
|
||||
.then(() => {
|
||||
clearTimeout(forceTimer);
|
||||
process.exit(0);
|
||||
})
|
||||
.catch((error) => {
|
||||
clearTimeout(forceTimer);
|
||||
console.error('Graceful shutdown failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
};
|
||||
|
||||
process.on('SIGINT', signalHandler);
|
||||
|
||||
Reference in New Issue
Block a user