Skip to content

v0.8.1 · 托盘点了没反应(已修)· 安装服务 ≠ 启用服务

Choose a tag to compare

@Lithivm Lithivm released this 19 Oct 08:44
· 5 commits to main since this release

双击托盘图标打不开界面(修好了)· 安装服务 ≠ 启用服务 · 顶栏流量图

v0.8.0 → v0.8.1,主要是一个会让人以为程序坏了的 bug,外加一处服务形态的语义调整。

一、托盘点了没反应(本版主戏)

现象:某台机器重启过几次之后,双击托盘图标、点「显示界面」一点动静都没有,
日志里也不留一个字。引擎照跑、内网照通,就是界面出不来。

根因是三个坑叠在一起:

  1. 孤儿界面:引擎被外部强杀(任务管理器 / 计划任务重启 / 崩溃)时,界面进程不会跟着死,
    它活下来、还占着「同一时间只跑一个界面」的那把锁。
  2. 新界面一启动就"让位":之后引擎每次拉起的界面都发现锁被占着,就把唤醒消息丢给那个孤儿、
    自己 30 毫秒后退出(退出码 0)。
  3. 看护把它当成"用户主动退出":于是看护循环永久收工 —— 从此这台机器再也没有界面,
    直到有人手工杀进程。现场那台孤儿活了三天,期间每次重启引擎都是白重启。

修法:

  • 界面进程带 -parent <引擎pid> 起来,宿主没了 2 秒内自己退出(不再产生孤儿占锁);
  • 看护遇到退出码 0 改为待命(点托盘会再拉一次),而不是收工;
  • 托盘点了先请「已经接上的那个界面」把窗口露出来,叫不动才重新拉起 ——
    以前是按"我有没有亲手拉起过进程"判断,等于把活着的那一个当空气。

验证:local/tray-fix.ps1(换 exe + 重启 + 端到端):点 X 收进托盘 → 点托盘能叫回来 →
强杀引擎后界面自己退出 → 再起界面正常,全过。

二、安装服务 ≠ 启用服务

以前 -service-install 装完就是"每次开机自动跑" —— 于是装来备用的服务会悄悄抢走引擎,
登录后起来的界面只能当只读失败者(没托盘、没通知、刷权限报错)。

现在跟「装虚拟网卡」和「开 TUN」分开一个道理:

  • nethub.exe -service-install:只注册(手动启动),不自己跑、不随开机;
  • 界面「设置 → headless 模式」新增开关「开机自启用服务形态」:
    拨开 = 设为开机自启 + 顺手关掉界面版那条计划任务自启(两个都开必然抢引擎)+ 当场交棒;
    拨关 = 取消开机自启(注册保留)+ 停服务 + 把引擎接回界面版;
  • 命令行对应 nethub.exe -service-autostart on|off,-service-state / -status 里能看到
    autoStart;
  • 重新部署(换路径/参数)不会冲掉你已经拨好的自启开关。

三、顶栏流量图

  • 曲线外面加了一层圆角淡底框,跟状态胶囊、按钮同一套视觉(以前是直接铺在白底上的一块色板);
  • 折线改成过中点的轻平滑(不移动任何采样点,只是把 4px 一个的折角磨圆);
  • 右端加了一个当前值小圆点,告诉你曲线"现在"落在哪;贴到最低/最高也不会被裁半边了。

四、顺手

  • README 的界面截图重拍(旧的被误删过)。
  • 「开机自启用服务形态」那行解释文案去掉(说明放进了卡片右上角的「i」)。

安装 / 升级

  • 包:NetHub.zip(不含任何配置与日志;把 config.yaml.example 复制成 config.yaml 填自己的上游)
  • 已经在用的:直接覆盖 nethub.exe(config.yaml 保留),或用「设置 → 关于 → 一键更新」。
  • 回滚:nethub.exe -rollback(旧程序保留为 nethub.exe.old)。

如果你这台机器上"两种形态都装着":本版之后"装着"是无害的,冲突的只是两条自启。
桌面机 → 界面里关掉「开机自启用服务形态」(服务注册留着备用),GUI 那条计划任务自启开着;
服务器 → 打开「开机自启用服务形态」,界面里关掉计划任务自启。

已知边界

  • UDP(QUIC 那一类)仍然只拦下不中继;只能 Windows x64;IPv6 主动不做。
  • GUI / 计划任务形态被点名杀进程后没有自动恢复能力(系统层面不支持);
    无人值守请用服务形态(它由 SCM 负责拉起,带熔断)。