hworker-4 estuvo 5 DÍAS idle (carga 0.00, sin crontab, sin loops, 37G de KDE sin cosechar) quemando dinero. El usuario había pedido esto explícitamente —"los vps se autoapagan cuando se detectan idle por un tiempo"— y de sus 3 puntos (volumen / auto-apagado / cosecha) implementé el 1 y el 3. Éste faltaba. EL FALLO ERA ESTRUCTURAL, no un olvido: farm-down.sh existe pero es MANUAL. El modelo "efímero" dependía de que el agente se acordara de llamarlo — y si su contexto se corta, o la sesión muere, el server queda vivo para siempre. Un invariante que necesita que alguien recuerde NO es un invariante. Por eso el switch vive EN EL WORKER: para apagarse no necesita ni al hub ni a mí. BORRA, no apaga: en Hetzner un server apagado SIGUE COBRANDO (disco + IP). Un poweroff daría sensación de ahorro y seguiría facturando. Precio: el token vive en el worker (/etc/hammer-deadman.env 0600). Riesgo real y consciente; se acepta porque la alternativa MEDIDA fue peor: 5 días de VPS idle. Cuenta por INACTIVIDAD CONTINUA, no por antigüedad: cualquier señal de trabajo (hammer build, worker-loop, heartbeat <30min) resetea los ticks. Guarda /var/lib/hammer-no-borrar aborta el borrado si hay cosecha pendiente. systemd timer y NO cron, por la lección medida: un cron "validado a mano" nunca disparó porque el PID 1 de aquella máquina (arje-zero) no tenía crond. Validar la LÍNEA no es validar que un demonio la ejecute. y el farm-up comprueban que el timer quedó ACTIVO — evidencia, no fe. Cableado en farm-up: todo worker NACE con el switch puesto. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
19 lines
828 B
SYSTEMD
19 lines
828 B
SYSTEMD
# Dispara el dead-man switch cada 10 min. 6 ticks sin trabajo = 1 h idle → el worker se borra solo.
|
|
#
|
|
# systemd timer y NO cron POR UNA LECCIÓN MEDIDA: un cron "validado a mano" nunca disparó porque el
|
|
# PID 1 de aquella máquina (arje-zero) no tenía crond. Validar la LÍNEA no es validar que un demonio
|
|
# la ejecute. El worker sí corre systemd, y `systemctl list-timers` da la evidencia de que está
|
|
# armado — verificable con `deadman.sh --verificar`.
|
|
[Unit]
|
|
Description=hammer: borra el worker si lleva 1h sin trabajo (baseline EUR 0)
|
|
|
|
[Timer]
|
|
OnBootSec=10min
|
|
OnUnitActiveSec=10min
|
|
# Persistent=false a propósito: si el server estuvo apagado no queremos una ráfaga de ticks al
|
|
# volver — la cuenta de idle debe medir tiempo REAL sin trabajo, no ticks perdidos.
|
|
Persistent=false
|
|
|
|
[Install]
|
|
WantedBy=timers.target
|