Repository navigation
v0.1.26 — 慢启动的 dsh web 不再被判死
v0.1.26 — 慢启动的 dsh web 不再被 watchdog 判死
修的问题
手动 dsh web 能启动(十几秒),但由 dsh-daemon 托管时起不来,status 一直报 ❌ unhealthy,watchdog 日志每 ~90 秒一次 failure threshold reached, restarting web server。两层根因:
- 启动期被判死:健康检查 30s 一跳、连续 3 次失败即重启,正好把仍在启动(大插件集 / 冷缓存)的
dsh web当成卡死,SIGKILL 后重新计时,进程永远走不完启动。 - 端口未释放就连着重启:停止旧进程后约 16ms 就拉起新的,
3080还占着,新进程在插件激活期listen EADDRINUSE秒退 → 秒退被判死 → 再重启,形成死亡循环。手动启动没有这一步,所以正常。
改动
- 新增启动宽限期
DSH_DAEMON_STARTUP_GRACE(默认5m,支持90s/5m等写法):宽限期内进程存活时,健康检查失败不计入重启阈值、也不会被杀,只记dsh web still starting (Xs of Ys grace, PID n) — not restarting。 - 停旧进程改为 SIGTERM → 最多等 8s → SIGKILL → 等端口真正空闲(最多 5s) 才拉起新进程,杜绝
EADDRINUSE连锁。 - 新增 15s 最小重启间隔(进程秒退时不再热循环);托管进程已消失(崩溃 / OOM / 激活期报错)时立即重启,不再等满 3 次失败。
dsh-daemon status/start/restart如实上报:⏳ still starting … 启动宽限期、❌ unhealthy … no managed web process running、端口被非托管进程占用,并打印dsh-web.log最后几行;start/restart会等满宽限期再给结论。stop也改为优雅停止(先 SIGTERM)。
升级须知
装完 0.1.26 后需要重新生成 watchdog:
dsh-daemon reinstall # 或 dsh_daemon_reinstall正在运行的 watchdog 是旧版本生成的脚本,不重新生成不会获得启动宽限期。启动确实很快(十几秒)时可以把宽限期收紧以便更快发现真正的卡死:
DSH_DAEMON_STARTUP_GRACE=90s dsh-daemon reinstall测试
- 新增
test/startup-grace.test.js:驱动真实生成的 watchdog + 假dsh,覆盖 ①宽限期内慢启动不重启不杀进程 ②超过宽限期才重启 ③重启前必先优雅停止(端口先释放),已接入npm test。 - CI 仍只跑不依赖本机状态的
npm run test:ci。