Gzip atomu mu?


11

gzipatomik?

gzipBir dosyayı gzipleme işleminin ortasındayken işlemi durdurursam ne olur ?

Atomik değilse ve zaten bir gzip *.txtişlemde Ctrl + C tuşlarına basarsam , nasıl güvenli bir şekilde devam edebilirim?

(Sadece nasıl devam edeceğimizi değil, aynı zamanda gzipspesifik olarak atomik olup olmadığını da merak ediyorum .)



4
"Güvenli bir şekilde nasıl devam ettirebilirim?" _... CTRL+ZBunun yerine kullanın CTRL+C, sonra kesilen işi öldürün veya devam ettirin (bir sayı ile cevap verir n[- [n]+ Stopped-- gzip ...] sonra aynı şekilde veya ile ya da ... %nile devam edebilirsiniz. ile öldürebilirsiniz ). fgbgkill %n
Hastur

Bir sıkıştır büyük sıkıştırırken dosyayı, Ctrl-C, ve ne olduğunu görün.
RonJohn

Hayır. Ext4… alaycılık damlaması dışında sadece mv atomiktir, ancak en azından bir süre önce varsayılan montaj seçeneklerini düzelttiler.
mirabilos

Yanıtlar:


28

Gzip atomu mu?

Hayır. Sıkıştırılmış bir dosya oluşturur ve sıkıştırılmamış orijinali kaldırır.

Özellikle, dosyayı yerinde sıkıştırmaz ve dosyanın sıkıştırıldığı bir süre vardır,

  • sıkıştırılmış hedef eksik
  • kısmen sıkıştırılmış dosya ve kaynağının ikisi de dosya sisteminde bulunur.

Bir dosyayı gziplemenin ortasındayken gzip işlemini durdurursam ne olur?

Durdurursanız gzip(a catchable sinyal ile süreci SIGINTdan Ctrl Cörneğin) kısmen dosyaları temizleme oluşturulur olacaktır. Aksi takdirde, durdurulduğu noktaya bağlı olarak, dokunulmamış orijinalin yanında kısmen sıkıştırılmış bir dosyayla sonuçlanabilir.

Atomik değilse, zaten bir gzip * .txt işleminde Ctrl + C tuşlarına basarsam, nasıl güvenli bir şekilde devam edebilirim?

Kısmen sıkıştırılmış sürümü (hala varsa) siler ve gzip.


5
2. işlemi ne olur sona s zaman değil, durdurulur ve olmayan tek ele sinyaller için olur (değil ^ C -> SIGINTya da SIGTERMbunun için gzipçıktı dosyası kaldırmak sinyal işleyici yükler).
mosvy

1
@mosvy öyle. Bunu daha önce hiç görmedim. Teşekkür ederim
roaima

1
Orijinalin silindiği için gzip edilmiş dosyaları silmediğinizden emin olmak için son derece özen gösterin. Gzip düzensiz bir şekilde öldürüldüğünde, bu genellikle bir dosya, genellikle son dosyadır.
Harper - Monica'yı geri

@Harper evet. gzipOrta akışı durdurursanız , her zaman küçük bir yarış durumu vardır. Alternatif olarak, gzipher zaman temizleme sorunlarının çoğunu ortadan kaldıran hedef dosyaların üzerine yazılmasını söyleyebilirsiniz .
roaima

15

(Unix dosya API gerçekten birden fazla dosya etkileyen atomik işlemleri gerçekleştirmek için herhangi bir yol sağlamaz) O atomik değil, ama bir fail-safe. Sıkıştırılmış dosya yeni bir dosyadır, orijinalin üzerine yazmaz ve sıkıştırılmış dosyayı oluşturmayı tamamlayana kadar orijinal dosyayı silmez (bunun için yeterli disk alanınız yoksa, aslında bir soruna neden olabilir. her iki dosya).

Bir hata alırsa veya sıkıştırmayı yarıda keserseniz, orijinal dosya değişmeden kalır. Kısmi sıkıştırılmış dosya genellikle kaldırılır.

Ortada devam ettirmenin bir yolu yok, sadece baştan başlatırsınız.


Bu beni atomik çok dosyalı işlemlerin nasıl uygulanabileceğini düşündürüyor. SQL işlemleri gibi bir şey mi?
val diyor Reinstate Monica

1
@val Yaklaşık 30 yıl önce Multics / GCOS takipçisi olarak yeni bir işletim sistemi tasarlayan bir ekipteydim ve veritabanı benzeri bir dosya sistemi bu fikrin bir parçasıydı. Ancak proje hiç bu kadar ileri gitmedi.
Barmar

NTFS işlemlerini kaldırdılar, komplikasyona değmez gibi görünüyor. Yeniden adlandırma en atomik işlemdir (aynı dosya sisteminde olduğunuz ve posix anlambilimine sahip olduğunuz sürece), bu nedenle temp'den son ada kadar bir rename (close / fsync'den sonra) sahip olmak, sıkıştırılmamış dosyanın en azından tamamlanmasını sağlar. Boruları (kendi kısmi arıza modlarına sahip olan) kullanarak bu sorunları
çözebilirsiniz

@eckes Sıkıştırılmış dosyayı kapattıktan sonra orijinali sildiği sürece, atomik yeniden adlandırmaya ihtiyacınız yoktur. Orijinal kaybolmuşsa, sıkıştırılmış dosyanın tamamlandığından emin olabilirsiniz. Orijinal dosyanın (ör. sed -i) Değiştirildiği işlemler için atomik yeniden adlandırma gerekir .
Barmar

@Barmar, yalnızca hedef dosyanın (birçok dizin çağırma iş akışının yaptığı) varlığıyla tetiklemek istiyorsanız, dosyanın tamamlandığından emin olmalısınız. Bunu tetiklemezseniz veya kaynak varlığını kontrol ederek eksik dosyaları tespit ederseniz, son yeniden adlandırma olmadan iyi durumdasınız demektir.
eckes

4

Bunun için endişelenmenize gerek yok çünkü gzipyeni bir .gzdosya oluşturur , sıkıştırılmış içerikle doldurur ve ardından orijinal dosyayı siler. İşlemi ortada durdurursanız, orijinal dosyanızı etkilemez.


3

.txtbaşarıyla başarıyla işlenen dosyalar sıkıştırılmış dosyalarla gzipdeğiştirilecek .txt.gz, böylece gzip *.txttekrar güvenle çalıştırabilirsiniz - yalnızca henüz işlenmemiş dosyalar sıkıştırılacaktır.

Ctrl-C'ye bastığınız anda gzip tarafından işlenen dosya değiştirilmez - gzip başarıyla sıkıştırıldıktan sonra değiştirilmez .


0

Hayır, çok belirsiz. Bir Web günlüğü gibi, arada sırada eklenen bir dosyayı sıkıştırırsanız, bu size büyük sorun çıkarır.

Gzip okur, .gz dosyasını oluşturur (geçerli zaman damgasıyla birlikte), orijinal dosyanın zaman damgasını kopyalar ve ardından orijinali siler.

Bazı kesintiler .txt.gzdosyanın hemen yanında başıboş, bitmemiş bir dosya bırakabilir .txt. Bu daha sonra bir veri bütünlüğü sorunu yaratır: Gerçek dosya hangisi? Bu

  • başarısız olan bir gzip, eksik / bozuk .txt.gz? Veya
  • eksik / kesilmiş bir .txtdosya bırakarak başarısız olan bir gunzip ? Veya
  • Bir dosya başarıyla sıkıştırıldı txt.gzve yeni oluşturulan bir .txt dosya mı?

(Bu son HTTP günlük dizininize girip gittiğinizde olur gzip *).

Ne olduğunu tam olarak bilmediğiniz için genellikle bunu elle halletmenin ihtiyatlı olduğunu görüyorum çünkü daha yeni yaptınız.

Neyse ki gzip genellikle seri olarak çalışır, bu nedenle sadece bir dosya ile bu sorunu yaşamalısınız. Paralel gzip iyi bir fikir değildir - CPU'yu daha eksiksiz kullanmasına rağmen, diski aynı anda birkaç dosyayı okumaya zorlayarak tüm gzip'leri büyük ölçüde yavaşlatır. Öte yandan SSD veya RAMdisk ...


1
@roaima. Gerçekten de, uzun zaman önce çalıştığım bir yerde kullandığımız bir argoya güveniyordum. Ortak tanımın düzeltilmesi.
Harper - Monica'yı geri

1
Eğer aşağı oylayacaksanız, lütfen nedenini açıklayan bir yorum bırakın.
JBentley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.