最近在部署 OpenClaw Gateway 的过程中遇到了几个麻烦:
- 手动启动不稳定
- 每次启动 Gateway 都会提示
already running (pid xxx) - 必须手动去杀掉残留 PID,并删除 lock 文件,才能重新启动
- 每次启动 Gateway 都会提示
- 计划任务自启动失败
- 用
openclaw gateway install创建计划任务时,报错系统找不到指定的文件或权限问题 - 放在
C:\Windows\System32下又遇到访问权限问题
- 用
- 静默启动的问题
- 默认后台静默启动时,终端看不到日志
- Dashboard 不会自动打开,需要手动访问
- 启动失败或者端口冲突时,很难发现
问题分析
总结下来,主要问题有三个:
- PID / lock 文件残留 → 导致
already running - Windows 权限限制 → System32 无法随意写文件,需要管理员
- 静默模式 → 虽然方便无人值守,但启动失败不易察觉
因此,需要一个 既能开机自启,又能自动打开 Dashboard,同时避免 already running 的方案。
核心目标
- 开机自动启动 Gateway
- 延时启动,保证系统初始化完成
- 清理残留 Node/OpenClaw 进程 & lock 文件
- 非静默终端,直接显示日志
- 自动打开默认浏览器访问 Dashboard
- 创建计划任务,开机自动运行脚本
核心组件部署
脚本路径建议标准化为 C:\ProgramData\OpenClaw\startup.ps1,避免用户路径依赖。需创建目录并设置权限:
New-Item -Path "C:\ProgramData\OpenClaw" -ItemType Directory -Force
$acl = Get-Acl "C:\ProgramData\OpenClaw"
$acl.SetAccessRuleProtection($true, $false)
Set-Acl -Path "C:\ProgramData\OpenClaw" -AclObject $acl
增强型进程清理
采用递归方式终止相关进程树:
function Stop-ProcessTree {
param($pid)
Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq $pid } | ForEach-Object { Stop-ProcessTree $_.ProcessId }
Stop-Process -Id $pid -Force -ErrorAction SilentlyContinue
}
Get-Process -Name node,openclaw -ErrorAction SilentlyContinue | ForEach-Object { Stop-ProcessTree $_.Id }
智能锁文件处理
增加文件存在性验证和日志记录:
$LockFiles = @( "$env:USERPROFILE\.openclaw\gateway.lock", "$env:LOCALAPPDATA\Temp\openclaw\*.lock" )
foreach ($file in $LockFiles) {
if (Test-Path $file) {
Remove-Item $file -Force
Add-Content -Path "$env:ProgramData\OpenClaw\cleanup.log" -Value "$(Get-Date) Removed: $file"
}
}

