a4phone 的续聊守护进程(a4p listen)以无窗口后台方式运行,持续监听手机订阅的主话题,收到文字即触发远程续聊;a4p setup 默认启动守护进程并注册 Windows 开机自启,登录时自动运行,无需手动干预。本文章介绍守护进程的启动/停止/状态管理、日志机制、断线重连与开机自启原理。

1. 守护进程概述

维度 说明
启动命令 a4p listen(后台运行)/ a4p listen --daemon-child(内部子进程)
停止命令 a4p listen --stop
状态命令 a4p listen --status
运行方式 隐藏窗口后台运行(Windows windowsHide + 脱离父进程)
日志位置 ~/.a4phone/daemon.log
进程信息 ~/.a4phone/daemon.json(PID、日志路径、启动时间)
版本要求 后台守护进程模式自 1.1.5 起,开机自启自 1.4.0 起

1.1 守护进程职责

graph LR A[a4p listen
后台守护进程] --> B[订阅主话题
ntfy NDJSON 流] A --> C[远程续聊
消息处理] A --> D[积压合并
批次持久化] A --> E[版本更新检查
周期推送手机] B --> F[收到手机文字] F --> C C --> G[按 Agent 续聊] G --> H[回复推回手机] E --> I[发现新版本
推送手机提醒] style A fill:#fdebd0,stroke:#b7950b,stroke-width:2px style B fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style C fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style D fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style E fill:#fadbd8,stroke:#c0392b,stroke-width:2px style F fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style G fill:#ffecd6,stroke:#e67e22,stroke-width:2px style H fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style I fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px

2. 启动与停止

2.1 启动守护进程

a4p listen

内部流程:

  1. 检查 ~/.a4phone/daemon.json 中记录的 PID 是否存活,已在运行则直接提示
  2. 以隐藏、脱离父进程的方式 spawn 一个 Node 子进程运行 a4p listen --daemon-child
  3. 子进程 stdout/stderr 重定向到 ~/.a4phone/daemon.log
  4. 写入 daemon.json(PID、日志路径、启动时间)

2.2 停止守护进程

a4p listen --stop
  • Windows 用 taskkill /pid <PID> /f /t 结束整个进程树,其他平台发送 SIGTERM
  • 等待 1 秒后确认进程退出,删除 daemon.json

Windows 上守护进程持有 daemon.log 句柄,a4p uninstall 会先停止守护进程再删除目录,避免删除失败。

2.3 查看状态

a4p listen --status

输出 PID、启动时间与日志路径;若进程记录存在但已不运行(异常退出),会提示并清理记录。

3. 消息监听与断线重连

守护进程通过 ntfy 的 NDJSON 流接口订阅主话题({server}/{topic}/json):

  • 断线自动重连:连接断开或异常时等待 5 秒后重连,since 参数从最后收到的消息之后继续,不丢消息
  • 消息过滤:带 title 的事件是系统推送通知(Claude Code 回复),不是手机用户消息,跳过
  • 纯文本识别:手机发的纯文本/JSON 原始值(如单个数字"3")作为续聊内容;JSON 对象(按钮回执)不作为续聊内容
  • 过时消息过滤:消息时间早于新会话创建时间则丢弃,避免旧消息注入新会话

4. 开机自启(Windows)

4.1 原理

在 Windows 启动文件夹(当前用户 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup)写入一个隐藏启动的 VBS 脚本,登录时自动运行 a4p listen

Set shell = CreateObject("WScript.Shell")
shell.Run """C:\path\node.exe"" ""C:\path\a4p.mjs"" listen", 0, False
  • 使用 Node 与 a4p 入口的绝对路径,不依赖 PATH
  • shell.Run 第 2 个参数 0 表示隐藏窗口运行
  • 无需管理员权限、无注册表依赖,删除文件即关闭

非 Windows 平台(WSL/Linux)暂不支持自动注册,可手动用 tmux / systemd 常驻守护进程。

4.2 管理命令

a4p autostart            # 查看开机自启状态
a4p autostart --on       # 开启开机自启
a4p autostart --off      # 关闭开机自启

4.3 setup 默认行为

a4p setup 默认启动守护进程并注册开机自启(两者失败均不阻塞 setup,给出提示)。a4p uninstall 会一并移除开机自启并停止守护进程。

5. 日志

守护进程日志写入 ~/.a4phone/daemon.log,记录关键事件:

[2026-08-16T10:00:00.000Z] 续聊守护进程已启动,监听: https://ntfy.sh/a4p-xxxx/json
[2026-08-16T10:05:00.000Z] 收到续聊请求:帮我总结一下刚才的改动
[2026-08-16T10:05:30.000Z] 消息已处理(resume 续聊,退出码 0),结果已推送手机。