[错误]:过时的数据目录锁导致 macOS 上的永久性 DataDirectoryLocked 死循环,原因是缺少 PID 重用验证
问题起源 在真实环境中观察或复制
QQ 错误描述
在openviking/utils/ process lock.py.'中,acquire data dir lock'用于检查另一个OpenViking实例是否持有咨询数据目录锁(`.openviking.pid')。
Linux有明确的处理方法来检查用于PID回收的`/proc/{pid}/cmdline' (以防止假阳性,参见#1088),macOS("darwin")缺乏任何命令行或处理身份验证. 在macOS上,"s pid alive"倒回"os.kill(pid, 0)".
如果机器重新爆炸,突然关闭,或程序意外地终止,而不运行出站钩,.openviking.pid'仍留在磁盘上。 如果操作系统随后将回收的PID重新分配给一个不相关的长寿命过程(例如系统守护进程,驱动程序扩展,如/系统/图书馆/司机扩展/IOUSER蓝牙连续 ' 或另一个应用程序),os.kill(pid, 0)'成功或遇到Permission Error'(被抓住并被通过),而s pid alive'无条件返回True'。
这导致OpenViking误认为另一个实例正在活跃,提出`Data DirectoryLocked',并在发射时立即坠毁。 当配置为持续守护进程或启动代理时,这会导致无休止地重启/崩溃循环.
- 重现步骤
- 在macOS上启动 " 开放服务器 " (它创建了X /.openviking/data/.openviking.pid)。
- 模拟坠机/重新启动,在停止 " 开机服务器 " 的同时离开 " .openviking.pid " 。
- 在macOS上找到一个无关的活性PID(例如任何长期运行的系统守护进程,如 " 启动 " 、 " WindowServer " 或驱动程序扩展),并将PID写入 ".openviking.pid " 。
- 运行 " 开放服务器 " 。
- 观察 " Data DirectoryLocked " 立即坠毁。
• 预期行为 QQis pid alive 应在macOS上验证进程命令行(例如使用'ps-p -o command Q). 如果直播过程与"开口"或"开口-服务器"不相匹配,则该锁应被作为 Stale, 登录并安全覆盖, 匹配Linux上的行为.
实际行为
开源服务器 ' 将Data DirectoryLocked ' 抬高并立即出站,防止启动,直到 ".开源服务器 " 被手动删除。
QQ 错误日志 贝壳 打开. utils. process lock. 数据DirectoryLocked:另一个OpenViking进程(PID 860)已经在使用数据目录"~/.openviking/data". 在同一个数据目录上运行多个 OpenViking 实例会导致沉默存储争议和数据腐败.
为了解决这个问题,采用其中一种办法:
- 使用 HTTP 模式: 启动单一的开源服务器并通过 -- Transport http(建议多会主机)连接
- 每个实例使用单独的数据目录
- 先停止另一个进程(PID 860)
2026-09-17 19:24:26,358 - uvicorn.error - ERROR - 应用程序启动失败. 离开。
QQ 开源版本
0.4.13 (并按 " 主要 " 分支机构的承付额转载)
Python 版本
3.1.3.2 (中文(简体) ).
操作系统
马科斯
. . . . . . .内容来源: volcengine/OpenViking