¿Es gzip atómico?

11

Es gzipatómico?

¿Qué sucede si detengo el gzipproceso mientras está comprimiendo un archivo?

Si no es atómico, y si ya presioné Ctrl + C en un gzip *.txtproceso, ¿cómo puedo reanudarlo de manera segura?

(No solo tengo curiosidad sobre cómo reanudar, sino también sobre si gzipespecíficamente es atómico).

Vendetta
fuente
Posible duplicado de ¿Cómo reanudo un comando tar que fue asesinado
Anthony Geoghegan
44
"¿Cómo puedo reanudar de forma segura?" _... Use en CTRL+Zlugar de CTRL+C, luego elimine o reanude el trabajo interrumpido (responde con un número n[- [n]+ Stopped-- gzip ...] luego puede reanudar con %no con fg, o con bg... de la misma manera puedes matarlo con kill %n).
Hastur
Comprima un archivo grande , Ctrl-C mientras lo comprime, y vea qué sucede.
RonJohn
No. Solo mv es atómico, excepto en ext4 ... goteo de sarcasmo, pero al menos arreglaron las opciones de montaje predeterminadas hace algún tiempo.
mirabilos

Respuestas:

28

¿Es gzip atómico?

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,

  • el objetivo comprimido está incompleto
  • el archivo parcialmente comprimido y su fuente existen en el sistema de archivos.

¿Qué sucede si detengo el proceso de gzip mientras está en medio de comprimir un archivo?

Si detiene el gzipproceso con una señal capturable ( SIGINTdesde 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.

Si no es atómico, si ya presioné Ctrl + C en un proceso gzip * .txt, ¿cómo puedo reanudarlo de manera segura?

Elimina la versión parcialmente comprimida (si aún existe) y reinicia el gzip.

roaima
fuente
55
el segundo ocurre cuando finaliza el proceso , no cuando se detiene , y solo ocurre para señales no manejadas (no para ^ C -> SIGINTo SIGTERMpara las que gzipinstala controladores de señales que eliminan el archivo de salida).
mosvy
1
@mosvy así lo hace. Nunca he visto eso antes. Gracias
roaima
1
Tenga mucho cuidado para asegurarse de no eliminar ningún archivo comprimido para el que se ha eliminado el original. Cuando gzip se elimina de forma irregular, generalmente es un archivo, generalmente el último.
Harper - Restablece a Mónica el
@ Harper sí. Si detiene el gzipflujo medio, siempre hay una pequeña condición de carrera allí. Alternativamente, puede indicarle que gzipsiempre sobrescriba los archivos de destino, lo que evita la mayoría de los problemas de limpieza.
roaima
15

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.

Barmar
fuente
Esto me hace pensar en cómo podrían implementarse las operaciones atómicas de múltiples archivos. Algo así como las transacciones SQL?
Val dice Reinstate Monica
1
@val Hace aproximadamente 30 años estaba en un equipo que estaba diseñando un nuevo sistema operativo como continuación de Multics / GCOS, y un sistema de archivos similar a una base de datos fue parte de la idea. Sin embargo, el proyecto nunca llegó muy lejos.
Barmar
Se eliminaron las transacciones NTFS, parece que no vale la pena la complicación. Cambiar el nombre es la operación más atómica (siempre que esté en el mismo sistema de archivos y tenga semántica posix), por lo que tener un cambio de nombre (después de cerrar / fsync) de temp al nombre final garantizaría que el archivo sin comprimir esté al menos completo. Puede solucionar esos problemas con el uso de tuberías (que tienen sus propios modos de falla parcial)
eckes
@eckes Siempre que elimine el original después de que cierre el archivo comprimido, no necesita el cambio de nombre atómico. Si el original se ha ido, puede estar seguro de que el archivo comprimido está completo. Necesita cambiar el nombre atómico para las operaciones que reemplazan el archivo original (por ejemplo sed -i).
Barmar
@Barmar si solo desea Activar por la existencia del archivo de destino (lo que hacen muchos flujos de trabajo de sondeo de directorios), es mejor asegurarse de que el archivo esté completo. Si no lo activa o puede detectar archivos incompletos al verificar la existencia de la fuente, entonces está bien sin el cambio de nombre final.
eckes
4

No necesita preocuparse por eso porque gzipcrea un nuevo .gzarchivo, 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.

Dr_
fuente
3

.txtlos archivos que ya gziphayan sido procesados ​​con éxito serán reemplazados por .txt.gzarchivos comprimidos, por lo que puede gzip *.txtvolver 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.

cas
fuente
0

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.gzarchivo perdido, sin terminar , justo al lado del .txtarchivo. Esto crea un problema de integridad de datos: ¿Cuál es el archivo real? Es esto

  • un gzip que falló, dejando un incompleto / corrupto .txt.gz? O
  • un gunzip que falló, dejando un .txtarchivo incompleto / truncado ? O
  • ¿Un archivo comprimido con éxito txt.gzy 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 ...

Harper - Restablece a Monica
fuente
1
@roaima. De hecho, confiaba en una jerga que significaba que solíamos usar hace mucho tiempo en un lugar donde trabajaba. Corrección a la definición común.
Harper - Restablece a Mónica el
1
Si va a votar a favor, deje un comentario explicando por qué.
JBentley