From e67f4752a4f63a1f734a97d67cb615e792638904 Mon Sep 17 00:00:00 2001 From: xiyidaiwa Date: Thu, 13 Aug 2026 22:49:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(stability):=20cancel-install=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20SIGTERM=E2=86=92SIGKILL=20=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E9=99=8D=E7=BA=A7=E9=98=B2=E6=AD=A2=E5=83=B5=E5=B0=B8=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - install-manager.ts: cancel-install 仅 kill()(SIGTERM),子进程忽略时成僵尸;新增 forceKill 封装先 SIGTERM 后 5s 超时降级 SIGKILL - PR 审查其余 6 项经代码实证均为误报/可维护性建议,未改动:JSON.parse 已有 try-catch、pkgname 已 PKGNAME_PATTERN 校验防穿越、shell-caller 已双引号+白名单、watch 不修改 apps.length 无循环、baseApps 量级无需 shallowRef、install-complete 已 off 清理 --- debian/changelog | 2 +- electron/main/backend/install-manager.ts | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 55118f5c..4b3e1c4a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -spark-store (5.2.1.6-test) UNRELEASED; urgency=medium +spark-store (5.2.1.7-test) UNRELEASED; urgency=medium * Initial release. (Closes: #nnnn) diff --git a/electron/main/backend/install-manager.ts b/electron/main/backend/install-manager.ts index aed615e7..bff79869 100644 --- a/electron/main/backend/install-manager.ts +++ b/electron/main/backend/install-manager.ts @@ -629,9 +629,22 @@ ipcMain.on("cancel-install", (event, id) => { const isRunning = task.phase === "downloading" || task.phase === "installing"; if (isRunning) { - // 运行中的任务:终止进程,由对应的阶段处理器在 finally 中清理计数器与队列 - task.download_process?.kill(); - task.install_process?.kill(); + // 运行中的任务:先发 SIGTERM 优雅终止;若 5s 内未退出,降级 SIGKILL 强制杀除, + // 避免子进程忽略 SIGTERM 变成僵尸进程(改进项:进程取消需 SIGKILL 降级处理)。 + const forceKill = (proc: ChildProcess | null, label: string) => { + if (!proc || proc.killed) return; + proc.kill("SIGTERM"); + const pid = proc.pid; + setTimeout(() => { + if (proc && !proc.killed) { + logger.warn(`任务 ${id} 的 ${label} 进程(${pid}) 未响应 SIGTERM,发送 SIGKILL`); + proc.kill("SIGKILL"); + } + }, 5000); + }; + forceKill(task.download_process, "下载"); + forceKill(task.install_process, "安装"); + // 由对应的阶段处理器在 finally 中清理计数器与队列 } else { // 排队中的任务(未开始执行):直接清理并调度 tasks.delete(id);