Skip to content

[Bug]: Windows 11 部署出现: OSError WinError 11 in process_lock._is_pid_alive breaks server startup #842

@leesen86

Description

@leesen86

Bug Description

环境

  • OS: Windows 11
  • Python: 3.12.4
  • openviking 包版本: 0.2.9 (pip show openviking

现象

启动 openviking-server 时,在应用 lifespan 初始化阶段失败,进程退出。

堆栈摘要

openviking.utils.process_lock.acquire_data_dir_lock_is_pid_aliveos.kill(pid, 0)
抛出:OSError: [WinError 11] 试图加载格式不正确的程序。(或英文等价信息)

复现步骤

  1. data 目录存在 .openviking.pid,且其中 PID 在 Windows 上对 os.kill(pid, 0) 会触发上述 OSError(或先按正常流程留下锁文件后异常退出)。
  2. 执行:openviking-server --config ov.conf
  3. 观察到 Application startup failed。

期望行为

_is_pid_alive 在 PID 无效或平台行为异常时,应视为进程不存在,允许覆盖陈旧锁文件,而不是未捕获异常导致整个服务无法启动。

可能原因(供参考)

_is_pid_alive 仅捕获 ProcessLookupError / PermissionError,Windows 上部分情况下 os.kill(pid, 0) 会抛出更泛化的 OSError(如 WinError 11),未被处理。

建议修复(可选)

_is_pid_alive 中在保留现有异常顺序的前提下,增加对 OSError 的处理并返回 False(或等价逻辑),并注意 PermissionError 仍为 OSError 子类,处理顺序需先处理 PermissionError

附加信息

  • 删除 .openviking.pid 后有时可临时恢复启动,但根因仍是 PID 探测在 Windows 上的异常类型。

错误信息

`(base) PS C:\Users\san_b.openclaw.openviking> openviking-server --config ov.conf
Loading config file: ov.conf
2026-03-21 16:22:09,467 - openviking.server.app - INFO - Bot API proxy disabled (use --with-bot to enable)
OpenViking HTTP Server is running on 127.0.0.1:1933
2026-03-21 16:22:09,546 - uvicorn.error - INFO - Started server process [29504]
2026-03-21 16:22:09,546 - uvicorn.error - INFO - Waiting for application startup.
2026-03-21 16:22:09,553 - openviking.utils.agfs_utils - INFO - [AGFSUtils] Created AGFSBindingClient (lib_path=C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\openviking\lib\libagfsbinding.dll)
time="2026-03-21T16:22:09+08:00" level=info msg="mounted serverinfofs at /serverinfo"
time="2026-03-21T16:22:09+08:00" level=info msg="[queuefs] SQLite backend initialized"
time="2026-03-21T16:22:09+08:00" level=info msg="[queuefs] Initialized with backend: sqlite"
time="2026-03-21T16:22:09+08:00" level=info msg="mounted queuefs at /queue"
time="2026-03-21T16:22:09+08:00" level=info msg="[localfs] Initialized with base path: C:\Users\san_b\.openclaw\.openviking\data\viking"
time="2026-03-21T16:22:09+08:00" level=info msg="mounted localfs at /local"
2026-03-21 16:22:09,573 - openviking.storage.queuefs.queue_manager - INFO - [QueueManager] Initialized with agfs=AGFSBindingClient, mount_point=/queue
2026-03-21 16:22:09,573 - openviking.storage.viking_vector_index_backend - INFO - VikingVectorIndexBackend facade initialized
2026-03-21 16:22:09,735 - openviking.storage.queuefs.queue_manager - INFO - Embedding queue initialized with TextEmbeddingHandler
2026-03-21 16:22:09,735 - openviking.storage.queuefs.queue_manager - INFO - Semantic queue initialized with SemanticProcessor
2026-03-21 16:22:09,882 - openviking.service.core - INFO - Initialized embedder (dim 1024, sparse False)
2026-03-21 16:22:09,887 - uvicorn.error - ERROR - Traceback (most recent call last):
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\starlette\routing.py", line 694, in lifespan
async with self.lifespan_context(app) as maybe_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\fastapi\routing.py", line 212, in merged_lifespan
async with original_context(app) as maybe_original_state:
File "C:\Users\san_b\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 210, in aenter
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\openviking\server\app.py", line 65, in lifespan
await service.initialize()
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\openviking\service\core.py", line 237, in initialize
acquire_data_dir_lock(self._config.storage.workspace)
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\openviking\utils\process_lock.py", line 59, in acquire_data_dir_lock
if existing_pid and existing_pid != my_pid and _is_pid_alive(existing_pid):
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\san_b\AppData\Roaming\Python\Python312\site-packages\openviking\utils\process_lock.py", line 38, in _is_pid_alive
os.kill(pid, 0)
OSError: [WinError 11] 试图加载格式不正确的程序。

2026-03-21 16:22:09,887 - uvicorn.error - ERROR - Application startup failed. Exiting.
(base) PS C:\Users\san_b.openclaw.openviking>
`

修复代码

Image

Steps to Reproduce

null

Expected Behavior

null

Actual Behavior

null

Minimal Reproducible Example

Error Logs

OpenViking Version

0.2.9

Python Version

Python: 3.12.4

Operating System

Windows

Model Backend

None

Additional Context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions