Skip to content

macOS 自动更新脚本提前终止,导致更新失败并在下次启动时再次退出 #3559

Description

@cindy-issue

提交人: dummycopy
客户端版本: 0.1.66


现象

自动更新补丁下载完成并进入应用阶段后,Cindy 会关闭,但没有自动重新启动。再次手动打开时仍是旧应用,启动数秒后又会主动退出,用户感知为“更新后无法重启,重新打开即闪退”。

复现步骤

  1. 使用存在可用更新的旧版 Cindy。
  2. 等待补丁下载完成,并满足自动应用更新的条件。
  3. Cindy 主进程退出。
  4. 等待自动重新启动,但应用没有再次打开。
  5. 手动打开 Cindy。
  6. 旧版检测到仍然存在的本地补丁,再次进入更新流程并主动退出。

期望行为

  • 外部更新器应在主进程退出后可靠存活,完成解压、替换应用并重新启动 Cindy。
  • 如果更新器交接或安装失败,应保留可运行的旧版本、明确提示失败,并停止自动退出重试,避免形成启动循环。

实际行为

  • 外部更新脚本启动并确认旧主进程已经退出。
  • 脚本在“等待文件系统稳定”的固定 2 秒等待阶段提前终止。
  • 后续的补丁解压、应用替换和重新启动均未执行。
  • 本地补丁继续保留,旧版下次启动后再次执行更新并以正常退出码主动关闭,因此表面上像闪退。

复现频率

在同一设备上连续记录到 28 次更新尝试,28 次均启动了更新脚本,但解压和重启验证次数均为 0;每次都停在同一个阶段。此前同一更新链路曾正常完成。

已尝试

  • 手工安装新版本后可以正常启动和使用。
  • 已验证应用签名与 Apple 公证有效。
  • 已验证应用目录和更新目录具有写权限。
  • 已确认自动重启设置处于启用状态。
  • 未发现与本次退出对应的系统崩溃报告或 Crashpad dump。

脱敏诊断摘要

  • 更新脚本的执行顺序为:等待旧 PID 退出 → 记录“等待文件系统稳定” → sleep 2 → 写更新锁 → 解压补丁 → 替换应用 → open 新应用。
  • 所有失败记录均只到 sleep 2 之前;更新锁、解压日志和脚本末尾的自删除均未发生,临时目录中遗留的脚本数量与失败次数一致。
  • 主进程诊断记录为 exitCode=0reason=update-relaunch,说明“再次打开即退出”不是 native crash,而是旧版主动重试更新。
  • macOS 分支的 executeUpdateMacOS()spawn('/bin/bash', ..., { detached: true, stdio: 'ignore' }).unref() 后立即调用 forceQuit() / process.exit(0),没有 updater 启动握手、存活确认或失败回传。
  • 现有日志无法确定 updater 收到的具体终止信号或信号来源,因此不应把 Electron、系统进程管理或安全组件中的某一个直接认定为已证实的触发源。

建议排查方向

  • 为 macOS updater 增加独立、可验证的生命周期托管。
  • 主进程仅在 updater 完成启动握手并确认可独立存活后退出。
  • updater 增加信号捕获、退出原因记录和安装结果回传。
  • 补充打包后的 Electron 端到端更新测试,而不仅验证生成的 shell 脚本本身。
  • 更新交接失败后停止启动时自动重试,并提供恢复或手工安装入口。

OS: darwin arm64 (27.0.0)
Harness: Codex
Model ID: gpt-5.6-sol
界面语言: zh-CN

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

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions