Es gzip
atómico?
¿Qué sucede si detengo el gzip
proceso mientras está comprimiendo un archivo?
Si no es atómico, y si ya presioné Ctrl + C en un gzip *.txt
proceso, ¿cómo puedo reanudarlo de manera segura?
(No solo tengo curiosidad sobre cómo reanudar, sino también sobre si gzip
específicamente es atómico).
command-line
gzip
Vendetta
fuente
fuente
CTRL+Z
lugar deCTRL+C
, luego elimine o reanude el trabajo interrumpido (responde con un númeron
[-[n]+ Stopped-- gzip ...
] luego puede reanudar con%n
o confg
, o conbg
... de la misma manera puedes matarlo conkill %n
).Respuestas:
No. Crea un archivo comprimido y luego elimina el original sin comprimir.
Específicamente, no comprime un archivo in situ y hay un período de tiempo mientras el archivo se comprime donde,
Si detiene el
gzip
proceso con una señal capturable (SIGINT
desde Ctrl C, por ejemplo), limpiará los archivos parcialmente creados. De lo contrario, dependiendo del punto en el que se detenga, puede terminar con un archivo parcialmente comprimido junto con el original intacto.Elimina la versión parcialmente comprimida (si aún existe) y reinicia el
gzip
.fuente
SIGINT
oSIGTERM
para las quegzip
instala controladores de señales que eliminan el archivo de salida).gzip
flujo medio, siempre hay una pequeña condición de carrera allí. Alternativamente, puede indicarle quegzip
siempre sobrescriba los archivos de destino, lo que evita la mayoría de los problemas de limpieza.No es atómico (la API del sistema de archivos Unix realmente no proporciona ninguna forma de realizar operaciones atómicas que afectan a múltiples archivos), pero es a prueba de fallas. El archivo comprimido es un archivo nuevo, no sobrescribe el original y no elimina el archivo original hasta que haya completado la creación del archivo comprimido (esto puede causar un problema si no tiene suficiente espacio en disco para ambos archivos).
Si se produce un error o si interrumpe la compresión, el archivo original permanecerá sin cambios. El archivo comprimido parcial generalmente se eliminará.
No hay forma de reanudarlo en el medio, solo comienza de nuevo desde el principio.
fuente
sed -i
).No necesita preocuparse por eso porque
gzip
crea un nuevo.gz
archivo, lo llena con el contenido comprimido y luego elimina el archivo original. Entonces, si detiene el proceso en el medio, no afectará su archivo original.fuente
.txt
los archivos que yagzip
hayan sido procesados con éxito serán reemplazados por.txt.gz
archivos comprimidos, por lo que puedegzip *.txt
volver a ejecutarlos de manera segura ; solo los archivos que aún no se han procesado se comprimirán.El archivo que estaba procesando gzip en el momento en que presionó Ctrl-C no se modificará; gzip no lo reemplazará hasta después de comprimirlo con éxito.
fuente
No, es muy poco atómico. Esto puede ocasionarle grandes problemas si comprime un archivo al que se agrega ocasionalmente, como un registro web.
Gzip lee, crea el archivo .gz (con la marca de tiempo actual), copia la marca de tiempo del archivo original y luego elimina el original.
Ciertas interrupciones pueden dejar un
.txt.gz
archivo perdido, sin terminar , justo al lado del.txt
archivo. Esto crea un problema de integridad de datos: ¿Cuál es el archivo real? Es esto.txt.gz
? O.txt
archivo incompleto / truncado ? Otxt.gz
y un archivo recién creado.txt
?(Esto último sucede cuando ingresas a tu directorio de registro HTTP y vas
gzip *
).En general, me parece prudente resolver esto a mano, a menos que sepa exactamente lo que sucedió porque lo acaba de hacer.
Afortunadamente, gzip generalmente funciona en serie, por lo que solo debería tener este problema con un archivo. Paralelamente, gzip no es una buena idea: aunque usará la CPU más completamente, dañará el disco y lo obligará a leer varios archivos a la vez, lo que ralentizará en gran medida todos los gzip. SSD o RAMdisk, por otro lado ...
fuente