Repository navigation
Replies: 1 comment
|
这条链我按 rc.2 源码逐行对过,你写的判断全部成立,而且比报告里说的更死一点。
所以你的现场是自洽的:锁里那个 PID 已经被别人复用了,探测得到 EPERM,代码按「活着」处理,等满 那真正的缺口在哪?不在判据,在报错什么都不告诉你。
如果要做显式清理入口, 最后一句: |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
现象
DSH Desktop 0.2.1-rc.2(
dsh --version→ 0.2.1-rc.2),Windows 11 x64,profiledesktop。在插件市场里更新插件(尤其是更新市场自己)之后,
~/.dsh/profiles/desktop/package.json.lock会残留。此后在 设置 → 插件 里停用/启用任何插件都要先等约 2 分钟,然后:删除这个 lock 文件才恢复。更新本身是成功的(
package.json里版本已经是新的)。现场
34080(单个 PID + 换行),mtime 14:53:45 就是获取时刻,之后几分钟不再变化。package.jsonmtime 14:53:46(写入成功,比锁晚 1 秒)。node -e "process.kill(34080,0)"→ EPERM;对照组(不存在的 PID)→ ESRCH。2908,同一天第二次出现。change()传入waitMs: 120000(@deepseek-ai/dsh-plugin-manager/lib/index.js:2400,默认值在:1576)。源码里的判断链(
@deepseek-ai/dsh-atomic-write/lib/index.js)withFileLock只在holderExited(record)为真时调用takeOverExitedLock;holderExited要求process.kill(pid, 0)抛出 ESRCH;问题在于 Windows 上「进程存在但当前用户探测被拒」与「PID 被复用 / 受保护进程」都表现为 EPERM,二者无法区分;而
dsh plugin子进程被taskkill /F之后留下的锁正好落进这个分支——没有人工介入就永远恢复不了。复现步骤
desktop。atomic-write: timed out waiting for the writer lock。%USERPROFILE%\.dsh\profiles\desktop\package.json.lock后立即恢复。建议
GetProcessTimes或/proc/<pid>的启动时刻),把接管判断从「kill(pid, 0)的信号结果」改成「启动时间不匹配 → 视为死锁」。dsh plugin这类长操作提供「清理自己创建的锁」的入口,避免子进程被强杀后finally无法执行。All reactions