Saltar al contenido
danielsanjuan

Cuaderno · 14 de noviembre de 2026

Ficheros llenos de ceros tras un corte de luz

linuxpythonhallazgo

Un programa no arrancaba porque su fichero de estado estaba lleno de bytes nulos. La causa y el arreglo.

Síntoma: después de un apagón, un JSON de estado ocupaba lo mismo de siempre pero era todo \x00, y el programa caía en bucle con JSONDecodeError. Pasa cuando el sistema se apaga mientras se escribe el fichero: el tamaño queda reservado, pero los datos no llegan al disco.

Arreglo: no escribir nunca encima del fichero bueno. Escribir en uno temporal, forzar que llegue al disco y sustituir de golpe:

import json, os

def guardar(ruta, datos):
    tmp = ruta + ".tmp"
    with open(tmp, "w") as f:
        json.dump(datos, f)
        f.flush()
        os.fsync(f.fileno())
    os.replace(tmp, ruta)  # atómico: queda el viejo o el nuevo, nunca uno a medias

Y al leer, si está dañado, apartarlo y seguir en vez de romperse:

try:
    estado = json.load(open(ruta))
except (ValueError, OSError):
    os.rename(ruta, ruta + ".dañado")
    estado = {}

Comprobar si un fichero es todo ceros:

python3 -c "b=open('estado.json','rb').read(); print(len(b), b.count(0))"

← Todas las notas