db_bkup_daily.sh je spouštěn cronem. Pokud předchozí běh stále probíhá (pomalá záloha velké DB, síťové problémy s resticem) a cron spustí nový, mohlo by dojít ke kolizi:
Po násilném přerušení (SIGKILL, restart kontejneru, OOM) lock directory zůstane — další cron běhy hlásí SKIP: daily backup already running donekonečna bez automatického recovery.
Zvažované alternativy:
A) Bez lockování — riziko souběžných běhů
B) flock / lockfile utility — závislost na externím nástroji, různé chování na různých OS
C) Lock directory + PID soubor + recovery skript (zvoleno) — bash-native, auditovatelné, s recovery
Lock mechanismus:
mkdir daily.lock — atomická operace v bash, selže pokud adresář existujeRecovery skript (scripts/backup-container-daily-recover.sh):
Recovery provede tyto kroky v pořadí:
1. Ověří, že backup kontejner běží
2. Zkontroluje existenci daily.lock adresáře
3. Ověří aktivní backup procesy přes docker top (hledá db_bkup procesy)
4. Pokud žádný aktivní backup proces neběží → lock je stale → bezpečně smaže
5. Pokud aktivní procesy běží → odmítne smazat lock, vypíše varování
6. --force flag jako nouzový override pro případ kdy docker top nedetekuje správně
Výsledek: admin má bezpečný, standardní postup pro recovery bez rizika smazání locku běžícího backupu.
Follow-up: zvážit zápis PID + timestamp do lock metadata pro přesnější validaci stale-lock stavu.
Pozitivní:
Negativní:
--force — nelze plně automatizovat bez znalosti kontextudocker top nemusí zachytit všechny subprocess formy backup skriptu — edge case při komplexním subshell spawningTODO:
daily.lock/pid, daily.lock/started_at) pro přesnější automatickou validaci stale stavu bez nutnosti docker top| Version | Date | Author | Note |
|---|---|---|---|
| 1.0.0 | 2026-04-09 | david.sorf + claude-sonnet-4-6 | Migrace z doc/ADR/ADR-0009-daily-locking-and-stale-lock-recovery.md do DAK JSON formátu. Rozšířeno o alternativy A/B/C, krok-za-krokem popis recovery procesu, PID TODO a edge case s docker top. |