TPTito Pinardo Gutiérrez
← Artículos
English

17 días de copias de seguridad vacías: el PATH de cron no tiene /usr/sbin

Tras un corte de luz, el fichero de cuentas del panel de los servidores de juego volvió a quedarse vacío. Fui a restaurar la copia que se hacía cada 30 minutos… y las de 17 días eran todas de 0 bytes.

  • Linux (Debian, Alpine, Arch)
  • Proxmox VE

Contexto

El panel de los servidores de juego guarda sus cuentas en un fichero JSON que no escribe de forma atómica: un apagado a mitad lo deja en «{}». Tras el primer corte, monté un cron en el hipervisor que copiaba ese fichero fuera del contenedor cada 30 minutos, guardando las últimas 100 versiones.

Qué fallaba

El script usaba pct, la herramienta de Proxmox para entrar en los contenedores, que vive en /usr/sbin. Lanzado a mano funcionaba. Desde cron, el PATH mínimo de Debian es solo /usr/bin:/bin: pct no existía para él.

Fallaba en cada pasada desde el primer día y, además, el script daba por buena cualquier salida, así que guardaba ficheros vacíos sin avisar. Otra pista que estaba ahí: el fichero original seguía con permisos 644, cuando el script debía dejarlo en 600 en cada pasada.

Arreglo

  • Rutas absolutas a los comandos (o un PATH explícito al principio del script).
  • Probarlo con el entorno real de cron, no con mi shell.
  • Validar cada copia antes de guardarla: si está vacía, es «{}» o no es JSON válido, se descarta y se deja un aviso.
# probar con el mismo entorno que cron
env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=/root /bin/sh -c /root/backup.sh

# lo que se acepta como copia
valid_json() { python3 -c 'import json,sys; d=json.load(open(sys.argv[1])); sys.exit(0 if d else 1)' "$1"; }

Restaurar

Con el panel parado (para que no reescriba el fichero a mitad), se restauró la última copia válida, con sus permisos. Al arrancar, el panel volvió con todas sus cuentas.