Skip to content

Windows 守护脚本未转义 node 路径——重启后自启链静默失效(附复现与源码定位) #1

Description

@rui08984-dot

环境

  • SessionRelay 0.5.1(npm 全局安装),Windows 11 (22631),Node v24 位于 C:\Program Files\nodejs\node.exe
  • srelay init --yes --install-service 方式部署

Bug

0.5.1 打包产物 dist/chunk-TLRVTGAH.js 的 windowsRunScript() 生成 watch cmd 时,args 里有空格会加引号,但 nodeAbs 本体是裸拼的:

const nodeAbs = process.execPath;  // C:\Program Files\nodejs\node.exe
const args = buildWatchArgs(root).map(a => a.includes(" ") ? `"${a}"` : a).join(" ");
return [..., `${nodeAbs} ${args} >> "${logFile}" 2>&1`, ...]

生成的 watch-task.cmd 首行无引号 → cmd 按空格切分 → 'C:\Program' 不是内部或外部命令(watch.log 里能抓到)。

影响(比较阴)

  • --install-service 是直接 spawn 守护进程的(不走 cmd),装完 watch --status 显示一切正常
  • cmd 只在登录自启时被用到 → 重启前看不出任何问题,重启后守护静默消失、会话捕获静默停摆,无任何告警
  • 手工给 nodeAbs 加引号即恢复(日志出现 [srelay-watch] initial: +N 消息),但之后每次 --install-service 都会重新生成无引号版,修复被冲掉

复现步骤

  1. Windows + 默认路径 Node,srelay init --yes --install-service
  2. 重启电脑(或手动运行生成的 watch-task.vbs)
  3. type .sessionrelay\watch.log → 'C:\Program' 不是内部或外部命令;守护未启动
  4. 给 cmd 里的 node 路径加引号 → 链路恢复正常

建议修复

nodeAbs 与 args 同样处理:"${nodeAbs}" ${args}(含空格时加引号)——windowsRunScript 一行改动。

顺带两个小观察(0.5.1,非阻断)

  • srelay unresolved --json 疑似丢弃了 --json 标志(decisions 正常透传 JSON);空时输出人话文本而非 JSON
  • stats.json 更新使用共享 .tmp 名 + rename,CLI 高并发时偶发 ENOENT(48 并发实测 2 例)

以上均在 Windows 11 实机复现。感谢这个项目——中文检索/零外呼/HOP 设计对我们非常实用。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions