DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
雨云;给项目一台云服务器
RackNerd;$21.99/年 · 1GB KVM

Node watch 不执行应用

NODE_OPTIONS 的下划线 watch 别名没从子进程过滤,应用不运行却递归生成进程。核对规范拼写与实际 macOS、Windows 监听条件。

Node 启动后没有打印应用的第一条日志,系统里却出现一层又一层 Node 子进程。若 watch 选项来自 NODE_OPTIONS,检查是否用了下划线拼写,例如 --watch_path。

Node 的一般选项解析允许下划线与连字符等价,但 watch 父进程给子进程清理环境选项时,未必按同样规则识别别名。已核对的正式版 26.11.1 中,这个过滤路径仍只列出了连字符形式。

核心解析成功,子进程过滤却漏掉

watch 模式本来需要一个父进程监听变化,再启动实际运行应用的子进程。为了避免子进程也进入 watch,父进程会从子进程的 NODE_OPTIONS 中去掉相关选项。

旧过滤判断识别 --watch-path、--watch-preserve-output 等拼写。核心解析器可以接受 --watch_path,但它进入清理列表时没有被识别,便继续传给子进程。子进程又成为一个 watch 父进程,继续往下生成,应用入口始终没有正常执行。

这属于环境继承与选项归一化之间的缺口,不是应用里的递归调用。重复启动同一个失败命令只会继续增加进程,不适合作为排查办法。

只修正对应的 watch 选项

停止自己启动的异常开发任务,按原来的进程管理方式清理其子进程,再查看启动脚本和 NODE_OPTIONS 的脱敏内容。保留认证、预加载和其他必要选项,不要直接清空整个环境变量。

对使用下划线的 watch 选项,改成规范的连字符形式。比如已有配置中的 --watch_path=./src 应改成 --watch-path=./src,实际路径保持原样。

如果决定把 watch 选项移到命令行,要同时从子进程继承的环境配置中去掉对应项,避免两处仍保留不同写法。这里只调整自己拥有的启动配置,不需要改全局 shell 环境或无关服务。

还要核对选项自身的条件。本文检查的 --watch-path 在正式文档中只支持 macOS 和 Windows,并且会关闭默认的 imported/required 模块监听,改为监听指定路径。Linux 上的 ERR_FEATURE_UNAVAILABLE_ON_PLATFORM 是另一种错误,不能通过修改下划线来获得平台不支持的能力。

指定路径也需要覆盖应用真正依赖的文件。为了避免递归生成而换成一个空目录,可能让进程启动了,却失去必要的更新触发。

不要把版本号当成过滤已修复

这里没有逐个核定所有历史发行版的受影响范围。26.11.1 的正式实现仍使用连字符过滤列表,因此也不能给这个问题建议“升级到 26.11.1 就好”。

选用后续版本时,应确认实际的子进程过滤处理是否覆盖别名。核心能解析某个选项,不代表每一层应用代码都完成了同样的归一化。

在受控环境中验收时,应用应真正开始运行,进程层次保持为预期的 watcher 与运行子进程。随后修改一处原先应被监听的文件,确认仍会正常重启。没有继续生成子代,只证明递归停止;丢掉监听范围也不能算完整修复。