Gzip è atomico?


11

È gzipatomico?

Cosa succede se interrompo il gzipprocesso mentre è in corso la compressione di un file?

Se non è atomico e se ho già premuto Ctrl + C su un gzip *.txtprocesso, come posso riprendere in sicurezza?

(Non sono solo curioso di sapere come riprendere, ma anche se gzipspecificamente è atomico.)



4
"come posso riprendere in sicurezza?" _... Utilizzare CTRL+Zinvece di CTRL+C, quindi terminare o riprendere il lavoro interrotto (risponde con un numero n[- [n]+ Stopped-- gzip ...], quindi è possibile riprendere con %no con fg, o con bg... allo stesso modo puoi ucciderlo con kill %n).
Hastur,

Comprimi un file di grandi dimensioni, Ctrl-C durante la compressione e guarda cosa succede.
RonJohn,

No. Solo mv è atomico, tranne sul gocciolamento di sarcasmo ext4 ..., ma almeno hanno riparato le opzioni di mount predefinite qualche tempo fa.
mirabilos,

Risposte:


28

Gzip è atomico?

No. Crea un file compresso e quindi rimuove l'originale non compresso.

In particolare, non comprime un file in situ e vi è un periodo di tempo durante la compressione del file in cui,

  • il target compresso è incompleto
  • il file parzialmente compresso e la sua origine esistono entrambi nel filesystem.

Cosa succede se interrompo il processo di gzip mentre è nel mezzo del gzip di un file?

Se si interrompe il gzipprocesso con un segnale catturabile ( SIGINTda Ctrl C, per esempio) sarà la pulizia in parte creati i file. Altrimenti, a seconda del punto in cui è stata interrotta, potresti finire con un file parzialmente compresso accanto all'originale non trattato.

Se non è atomico, se ho già premuto Ctrl + C su un processo gzip * .txt, come posso riprendere in sicurezza?

Si elimina la versione parzialmente compressa (se esiste ancora) e si riavvia il gzip.


5
il secondo si verifica quando il processo viene terminato , non quando viene arrestato e si verifica solo per segnali non gestiti (non per ^ C -> SIGINTo SIGTERMper i quali gzipinstalla gestori di segnali che rimuovono il file di output).
mosvy,

1
@mosvy così fa. Non l'ho mai visto prima. Grazie
roaima il

1
Prestate la massima attenzione per assicurarvi di non eliminare alcun file compresso per il quale l'originale è stato eliminato. Quando gzip viene ucciso in modo irregolare, di solito si tratta di un file, di solito l'ultimo.
Harper - Ripristina Monica il

@Harper sì. Se interrompi il gzipflusso medio, c'è sempre una condizione di gara minuscola. In alternativa, puoi gzipsempre dire di sovrascrivere i file di destinazione, il che elimina la maggior parte dei problemi di pulizia.
roaima,

15

Non è atomico (l'API del filesystem Unix non fornisce alcun modo per eseguire operazioni atomiche che interessano più file), ma è a prova di errore. Il file compresso è un nuovo file, non sovrascrive l'originale e non elimina il file originale fino a quando non ha completato la creazione del file compresso (ciò può effettivamente causare un problema se non si dispone di spazio su disco sufficiente per entrambi i file).

Se viene visualizzato un errore o si interrompe la compressione, il file originale rimarrà invariato. Il file compresso parziale verrà generalmente rimosso.

Non c'è modo di riprenderlo nel mezzo, basta ricominciare dall'inizio.


Questo mi fa pensare a come potrebbero essere implementate le operazioni atomiche multifile. Qualcosa come le transazioni SQL?
dice Val Reinstate Monica il

1
@val Circa 30 anni fa facevo parte di un team che stava progettando un nuovo sistema operativo come followon Multics / GCOS e un file system simile a un database faceva parte dell'idea. Il progetto non è mai andato molto lontano, però.
Barmar,

Hanno rimosso le transazioni NTFS, sembra non valere la complicazione. Rinomina è l'operazione più atomica (purché si trovi sullo stesso file system e abbia una semantica posix), quindi avere una ridenominazione (dopo close / fsync) da temp a nome finale assicurerebbe che il file non compresso sia almeno completo. Puoi aggirare questi problemi usando le pipe (che hanno le loro modalità di errore parziale)
controlla il

@eckes Fintanto che elimina l'originale dopo aver chiuso il file compresso, non è necessario il nome atomico. Se l'originale è sparito, puoi essere sicuro che il file compresso sia completo. È necessario rinominare atomicamente per le operazioni che sostituiscono il file originale (ad es sed -i.).
Barmar,

@Barmar se si desidera eseguire il trigger solo dall'esistenza del file di destinazione (come fanno molti flussi di lavoro di polling della directory), è meglio assicurarsi che il file sia completo. Se non ti attivi su quello o riesci a rilevare i file incompleti controllando l'esistenza della fonte, allora stai bene senza la ridenominazione finale.
Devo dire il

4

Non devi preoccuparti perché gzipcrea un nuovo .gzfile, lo popola con il contenuto compresso, quindi elimina il file originale. Quindi, se interrompi il processo nel mezzo, non influirà sul file originale.


3

.txti file già elaborati con successo gzipsaranno stati sostituiti con .txt.gzfile compressi, quindi è possibile eseguirli di gzip *.txtnuovo in modo sicuro : solo i file che non sono stati ancora elaborati verranno compressi.

Il file che era stato elaborato da gzip nel momento in cui hai premuto Ctrl-C non sarà modificato - gzip non lo sostituirà fino a dopo averlo compresso con successo.


0

No, è molto poco anatomico. Questo può creare grossi problemi se si decomprime un file che viene occasionalmente aggiunto, come un registro Web.

Gzip legge, crea il file .gz (con il timestamp corrente), copia il timestamp del file originale, quindi elimina l'originale.

Alcune interruzioni possono lasciare un .txt.gzfile vagante e incompiuto proprio accanto al .txtfile. Ciò crea quindi un problema di integrità dei dati: qual è il file reale? È questo

  • un gzip che ha fallito, lasciando un incompleto / corrotto .txt.gz? O
  • un gunzip che ha fallito, lasciando un .txtfile incompleto / troncato ? O
  • Un file è stato decompresso correttamente txt.gze un file appena creato .txt ?

(Quest'ultimo accade quando si accede alla directory del registro HTTP e si va gzip *).

In genere trovo prudente risolvere questo problema manualmente, a meno che tu non sappia esattamente cosa è successo perché l'hai appena fatto.

Fortunatamente gzip di solito funziona in serie, quindi dovresti avere questo problema con un solo file. Parallelizzare gzip non è una buona idea - anche se utilizzerà la CPU in modo più completo, si romperà il disco costringendolo a leggere diversi file contemporaneamente, rallentando notevolmente tutti i gzip. SSD o RAMdisk, d'altra parte ...


1
@roaima. In effetti, stavo facendo affidamento su un gergo che significavamo usare molto tempo fa in un posto in cui lavoravo. Correzione della definizione comune.
Harper - Ripristina Monica il

1
Se hai intenzione di sottovalutare, lascia un commento che spiega perché.
JBentley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.