CI runner 修"双看门狗抢 .runner.lock":-StartNow 先清残留进程再启动
实测发现(比文档问题更要紧):runner 网页 online、-Status 说 daemon 在跑, 但 runner-watchdog.log 每 10 秒刷 "starting daemon → daemon exited, exit code 1", daemon 日志写 "another gitea-runner process is already using .runner" / "runner file is already locked by another process"。 根因:Unregister-ScheduledTask 不会带走旧实例启动的进程。13:22 重跑 bootstrap 时, 12:53 起的旧看门狗成为孤儿并继续养着旧 daemon,旧 daemon 占住 .runner.lock, 新注册任务启动的看门狗永远抢不到锁。online 是旧 daemon 在硬撑——任务实际谁也没管, 日志还在以约 20 MB/天 增长。 - ci_runner_bootstrap.ps1:-StartNow 新增 Stop-StaleRunnerInstances,先停孤儿看门狗 再停残留 daemon(顺序不能反:只杀 daemon 会被活着的看门狗 10 秒内重拉),启动后 等 12 秒回显单实例确认;-Status 新增重复实例计数 + daemon 日志锁冲突检测 - 指南 §3.4 补注销不停进程的说明与"纯注释改动不需重启任务";§7 排障表加 "online 却每 10 秒重启"一行(含手工应急命令) - §3.2 / README:deploy_runner_task.ps1 与 run_runner.cmd 状态由"仍在磁盘、建议删除" 改为"已删除";README 补重跑部署前的锁冲突警示 机器侧同步(不在版本库):config.yaml 头部"常驻改用 sc.exe / New-Service"是 §3.0 已证伪的错误指引,改为看门狗口径并指向本文——改后 YAML 可解析且所有配置值逐项与 改前一致(只动注释);删除两个废弃脚本前核实计划任务动作目标是 run_runner_watchdog.ps1,删除不影响在跑 runner;check_env.ps1 指向废弃脚本的提示 改指 bootstrap(带 BOM 文件,改后 BOM 完好、语法 0 错)。 验证:pre-commit run --all-files 17 项全 Passed;bootstrap parse 0 错、纯 ASCII、 -DryRun 正常。当前 runner 仍 online(旧 daemon 硬撑),彻底归一需管理员跑一次 -StartNow 清残留。
This commit is contained in:
+11
-4
@@ -56,10 +56,16 @@
|
||||
> 变量;返回码 `0x41301` 是"任务正在运行"、`next run` 为空是开机触发器的正常表现,
|
||||
> 都不是故障(详见指南 §3.4)。
|
||||
|
||||
> 🗑 **机器侧遗留,别误用**:`D:\Docker\act_runner\` 下还留着旧方案的 `deploy_runner_task.ps1`
|
||||
> 与 `run_runner.cmd`。它们跑的是**单次** daemon——首次 Declare 失败就永久停摆(机理见指南
|
||||
> §3.2),而且**执行它会把看门狗任务覆盖回单次任务**。现行部署只有 `ci_runner_bootstrap.ps1`
|
||||
> 这一条路;那两个文件建议改名加 `.deprecated` 后缀或直接删除。
|
||||
> ✅ **机器侧遗留已清理(2026-10-12)**:旧方案的 `deploy_runner_task.ps1` 与 `run_runner.cmd`
|
||||
> 已从 `D:\Docker\act_runner\` **删除**(它们跑单次 daemon,首次 Declare 失败就永久停摆,
|
||||
> 机理见指南 §3.2;`check_env.ps1` 里指向它们的提示也已改指 bootstrap)。
|
||||
> 现行部署只有 `ci_runner_bootstrap.ps1` 这一条路。
|
||||
|
||||
> 🔴 **重跑部署前先知道这条**(2026-10-12 实测):`Unregister-ScheduledTask` **不会**带走旧实例
|
||||
> 启动的进程。旧看门狗会作为孤儿继续养着它的 daemon,而那个 daemon 占着 `.runner.lock`,
|
||||
> 于是新看门狗每 10 秒失败一次(`runner file is already locked by another process`)——
|
||||
> **而 runner 在网页上照样显示 online**,CI 看着正常,任务其实谁也没管。
|
||||
> 现在 `-StartNow` 会先清掉这些残留进程再启动(约离线几秒),`-Status` 也会报出重复实例。
|
||||
|
||||
## 相关文档
|
||||
|
||||
@@ -73,5 +79,6 @@
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-12 | 🔴 **修复"双看门狗抢 `.runner.lock`"缺陷**:`Unregister-ScheduledTask` 不停旧实例进程 → 孤儿看门狗养着旧 daemon 占锁,新看门狗每 10 秒失败一次,而 runner 网页照样 online、`-Status` 也说"在跑"。现 `-StartNow` 先清残留进程再启动、`-Status` 报重复实例与锁冲突。同日清理机器侧:`config.yaml` 头部错误指引("改用 sc.exe / New-Service")改为看门狗口径,删除已废弃的 `deploy_runner_task.ps1` 与 `run_runner.cmd`,`check_env.ps1` 提示同步改指 bootstrap |
|
||||
| 2026-10-12 | **单一口径清理**:合并稿初版对 4 处分歧"两说并存",现统一为本机实测现状——注册口径(`gitea-runner v4.0.1` / `D:\Docker\act_runner` / `127.0.0.1:3001`,旧 `act_runner v0.2.11` + `C:\act_runner` 段删去可复制命令只留警示)、`config.yaml`(`fetch_timeout: 1m0s`、`timeout: 30m0s`)、常驻方式(只认看门狗,`deploy_runner_task.ps1` 标废弃)、验收数字(L0.5 `288/288`,历史数字标注为快照)。并补"机器侧遗留脚本勿误用"警示 |
|
||||
| 2026-10-12 | **新建本目录**:远程 CI 内容原先散在 `docs/环境与部署/`(两篇互相重叠的指南)、`docs/测试说明/测试开发标准流程.md` §9、`AGENTS.md` 提交门禁节共 4 处,约 2000 行;现合并为单一指南并把 `AGENTS.md` 压成一行指针。动因:远程 CI 只涉及本机一台 runner,与日常开发规范混在一起每次会话都被读,造成困惑 |
|
||||
|
||||
Reference in New Issue
Block a user