O gzip é atômico?


11

É gzipatômico?

O que acontece se eu parar o gzipprocesso enquanto estiver no meio de um arquivo compactado?

Se não é atômico e se eu já pressionei Ctrl + C em um gzip *.txtprocesso, como faço para retomar com segurança?

(Não estou apenas curioso sobre como retomar, mas também sobre se gzipé especificamente atômico.)



4
"como faço para retomar com segurança?" _... Use em CTRL+Zvez de CTRL+C, em seguida, mate ou retome o trabalho interrompido (ele responde com um número n[- [n]+ Stopped-- gzip ...] e, em seguida, você pode retomar com %nou com fgou com bg... da mesma maneira você pode matá-lo com kill %n).
Hastur

Compacte um arquivo grande , Ctrl-C durante a compactação, e veja o que acontece.
RonJohn

Não. Somente o mv é atômico, exceto no ext4… sarcasm pingando, mas pelo menos eles corrigiram as opções de montagem padrão há algum tempo.
mirabilos

Respostas:


28

O gzip é atômico?

Não. Ele cria um arquivo compactado e remove o original não compactado.

Especificamente, ele não comprime um arquivo in situ e há um período de tempo enquanto o arquivo está sendo compactado, onde,

  • o alvo compactado está incompleto
  • o arquivo parcialmente compactado e sua origem existem no sistema de arquivos.

O que acontece se eu parar o processo do gzip enquanto ele estiver no meio do gzip de um arquivo?

Se você parar o gzipprocesso com um sinal capturável ( SIGINTde Ctrl C, por exemplo), ele limpará os arquivos parcialmente criados. Caso contrário, dependendo do ponto em que foi interrompido, você poderá acabar com um arquivo parcialmente compactado ao lado do original intocado.

Se não for atômico, se eu já pressionei Ctrl + C em um processo gzip * .txt, como faço para retomar com segurança?

Você exclui a versão parcialmente compactada (se ainda existir) e reinicia o gzip.


5
o segundo acontece quando o processo é finalizado , não quando é interrompido e ocorre apenas para sinais não manipulados (não para ^ C -> SIGINTou SIGTERMpara os quais gzipinstala manipuladores de sinal que removem o arquivo de saída).
mosvy

1
@mosvy assim faz. Eu nunca vi isso antes. Obrigado
roaima 23/08/19

1
Você toma muito cuidado para garantir que não exclua nenhum arquivo compactado com gzip para o qual o original foi excluído. Quando o gzip é eliminado de maneira irregular, geralmente esse é um arquivo, geralmente o último.
Harper - Restabelece Monica

@ Harper yes. Se você parar o gzipfluxo médio, sempre haverá uma pequena condição de corrida. Como alternativa, você pode gzipsempre dizer para substituir os arquivos de destino, o que evita a maioria dos problemas de limpeza.
roaima 24/08/19

15

Não é atômico (a API do sistema de arquivos Unix realmente não fornece nenhuma maneira de executar operações atômicas que afetam vários arquivos), mas é à prova de falhas. O arquivo compactado é um novo arquivo, não substitui o original e não exclui o arquivo original até concluir a criação do arquivo compactado (isso pode causar um problema se você não tiver espaço em disco suficiente para ambos os arquivos).

Se ocorrer um erro ou você interromper a compactação, o arquivo original permanecerá inalterado. O arquivo compactado parcial geralmente será removido.

Não há como retomar no meio, basta recomeçar desde o início.


Isso me faz pensar em como as operações atômicas de múltiplos arquivos podem ser implementadas. Algo como transações SQL?
val diz Reintegrar Monica

1
@val Há cerca de 30 anos, eu fazia parte de uma equipe que estava projetando um novo sistema operacional como um acompanhamento do Multics / GCOS, e um sistema de arquivos parecido com um banco de dados fazia parte da idéia. O projeto nunca chegou muito longe, no entanto.
Barmar

Eles removeram transações NTFS, parece não valer a complicação. Renomear é a operação mais atômica (desde que você esteja no mesmo sistema de arquivos e tenha semântica posix), portanto, renomear (após fechar / fsync) de temp para o nome final garantiria que o arquivo descompactado estivesse pelo menos completo. Você pode contornar esses problemas com o uso de tubos (que têm os seus próprios modos de falha parcial)
Eckes

@eckes Desde que exclua o original depois de fechar o arquivo compactado, você não precisará renomear o atômico. Se o original acabar, você pode ter certeza de que o arquivo compactado está completo. Você precisa renomear atômica para operações que substituem o arquivo original (por exemplo sed -i).
Barmar

@ Barmar, se você deseja acionar apenas a existência do arquivo de destino (que muitos fluxos de trabalho de pesquisa de diretório fazem), é melhor ter certeza de que o arquivo está completo. Se você não acionar isso ou detectar arquivos incompletos verificando a existência de origem, estará bem sem a renomeação final.
eckes 25/08/19

4

Você não precisa se preocupar com isso, porque gzipcria um novo .gzarquivo, preenche-o com o conteúdo compactado e exclui o arquivo original. Portanto, se você parar o processo no meio, isso não afetará seu arquivo original.


3

.txtos arquivos já processados ​​com êxito por gzipserão substituídos por .txt.gzarquivos compactados, para que você possa executar gzip *.txtnovamente com segurança - apenas os arquivos que ainda não foram processados ​​serão compactados.

O arquivo que estava sendo processado pelo gzip no momento em que você pressionou Ctrl-C não será modificado - o gzip não o substituirá até depois de compactá-lo com êxito.


0

Não, é muito anatômico. Isso pode causar grandes problemas se você compactar um arquivo que está sendo anexado ocasionalmente, como um log da Web.

O Gzip lê, cria o arquivo .gz (com registro de data e hora atual), copia o registro de data e hora do arquivo original e exclui o original.

Certas interrupções podem deixar um .txt.gzarquivo perdido e inacabado ao lado do .txtarquivo. Isso cria um problema de integridade de dados: qual é o arquivo real? É isto

  • um gzip que falhou, deixando um incompleto / corrompido .txt.gz? Ou
  • um gunzip que falhou, deixando um .txtarquivo incompleto / truncado ? Ou
  • Um arquivo compactado com sucesso txt.gze um arquivo recém-criado .txt ?

(Este último acontece quando você entra no diretório de log HTTP e sai gzip *).

Geralmente acho prudente resolver isso manualmente, a menos que você saiba exatamente o que aconteceu porque acabou de fazer.

Felizmente, o gzip geralmente opera em série, então você só deve ter esse problema com um arquivo. Paralelamente ao gzip não é uma boa idéia - mesmo que ele use a CPU mais completamente, ele destrói o disco, forçando-o a ler vários arquivos ao mesmo tempo, diminuindo bastante a velocidade de todos os gzip. SSD ou RAMdisk, por outro lado ...


1
@roaima. Na verdade, eu estava contando com uma gíria que costumávamos usar há muito tempo, em um local onde trabalhei. Corrigindo a definição comum.
Harper - Restabelece Monica

1
Se você deseja votar, por favor, deixe um comentário explicando o porquê.
JBentley
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.