61 lines
3.4 KiB
Markdown
61 lines
3.4 KiB
Markdown
---
|
||
tags: [vault, git, sync, cron, incident]
|
||
date: 2026-09-16
|
||
---
|
||
|
||
# 2026-09-16 — молчащие тики идут кластерами 4–5 подряд
|
||
|
||
## Итог ручного прогона (01:00 UTC)
|
||
|
||
```bash
|
||
cd /opt/data && bash /opt/data/sync-vault.sh >> /tmp/vault-sync.log 2>&1
|
||
```
|
||
|
||
Exit 0, «Pushed ✓» по всем трём фазам. Фаза 1 подтянула правки Eagle (коммит `8fe2e51`:
|
||
`family/how-to/ha-automations.md`, `family/how-to/home-automation.md`,
|
||
`family/tech/ha-registry-operations.md`, `family/tech/zigbee-t610-z2m-i-zha.md`).
|
||
|
||
Проверка: `/vault`, `/obsidian-syncthing` и bare — все на `8fe2e51`, `git status --porcelain` пуст
|
||
(жёсткие симлинки на /.obsidian в sparse checkout — норма).
|
||
|
||
## Находка: молчащие тики группируются
|
||
|
||
Метод: сверка `/tmp/vault-sync.log` с `/opt/data/cron/executions.db` по job_id `29851c413903`,
|
||
окно = с начала текущего лога (2026-09-15 11:35:19 — лог был обрезан при рекреации контейнера)
|
||
до 2026-09-16 01:00.
|
||
|
||
- запусков: 161, из них **11 (6,8 %) `completed` без единой строки в логе** (~19 с и меньше)
|
||
- это тот же режим отказа, что описан 2026-09-14: LLM-раунд отвечает текстом, bash не вызывается
|
||
- **новое:** пропуски идут не по одному, а кластерами:
|
||
- 2026-09-15 16:55 → 17:15 — 5 подряд (25 мин без синка)
|
||
- 2026-09-15 23:45 → 00:00 — 4 подряд (20 мин без синка)
|
||
- одиночные: 13:55, 22:50
|
||
|
||
Разрывы >10 мин в логе поэтому надо читать как «тик выполнился, но скрипт не вызван», а не как
|
||
«диспетчер не запустил задачу». Данные не теряются: git-синк идемпотентен, следующий удачный тик
|
||
догоняет всё.
|
||
|
||
Скрипт сверки (лог × executions.db, считает кластеры):
|
||
|
||
```bash
|
||
python3 - <<'EOF'
|
||
import sqlite3,re
|
||
from datetime import datetime
|
||
c=sqlite3.connect('file:/opt/data/cron/executions.db?mode=ro',uri=True)
|
||
rows=c.execute("select claimed_at,finished_at,status from executions where job_id='29851c413903' order by claimed_at").fetchall()
|
||
log=open('/tmp/vault-sync.log',encoding='utf-8',errors='replace').read()
|
||
log_start=datetime.strptime(re.search(r'\[(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)\]',log).group(1),'%Y-%m-%d %H:%M:%S')
|
||
ticks=set(re.findall(r'\[(\d{4}-\d\d-\d\d \d\d:\d\d):\d\d\] \[syncthing\] Pushed',log))
|
||
sel=[r for r in rows if datetime.fromisoformat(r[0]).replace(tzinfo=None)>=log_start]
|
||
miss=[r[0][:16].replace('T',' ') for r in sel if r[2]=='completed' and r[0][:16].replace('T',' ') not in ticks]
|
||
print('runs',len(sel),'silent',len(miss))
|
||
for m in miss: print(' ',m)
|
||
EOF
|
||
```
|
||
|
||
## Что не сделано
|
||
|
||
Корневая причина — prompt-задача: каждый тик требует LLM-раунда, а раунд иногда заканчивается без
|
||
вызова инструмента. Устранение (убрать LLM из петли) — `hermes cron edit 29851c413903 --no-agent
|
||
--script <path>`, требует решения владельца (см. заметку 2026-09-14).
|