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 守护进程职责
后台守护进程] --> 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
内部流程:
- 检查
~/.a4phone/daemon.json中记录的 PID 是否存活,已在运行则直接提示 - 以隐藏、脱离父进程的方式 spawn 一个 Node 子进程运行
a4p listen --daemon-child - 子进程 stdout/stderr 重定向到
~/.a4phone/daemon.log - 写入
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),结果已推送手机。
举手提问