Apakah gzip atom?

11

Apakah gzipatom?

Apa yang terjadi jika saya menghentikan gzipproses ketika sedang gzipping file?

Jika itu bukan atom, dan jika saya sudah menekan Ctrl + C pada suatu gzip *.txtproses, bagaimana cara melanjutkan dengan aman?

(Saya tidak hanya ingin tahu tentang bagaimana melanjutkan, tetapi juga tentang apakah gzipsecara spesifik adalah atomik.)

Vendetta
sumber
Kemungkinan duplikat dari Bagaimana saya melanjutkan perintah tar yang terbunuh
Anthony Geoghegan
4
"Bagaimana cara melanjutkan dengan aman?" _... Gunakan CTRL+Zalih-alih CTRL+C, lalu bunuh atau lanjutkan pekerjaan yang terputus (itu menjawab dengan angka n[- [n]+ Stopped-- gzip ...] lalu Anda dapat melanjutkan dengan %natau dengan fg, atau dengan bg... dengan cara yang sama Anda dapat membunuhnya dengan kill %n).
Hastur
Kompres file besar , Ctrl-C sambil mengompresi, dan lihat apa yang terjadi.
RonJohn
Tidak. Hanya mv yang atomik, kecuali pada ext4 ... sarkasme menetes, tetapi setidaknya mereka memperbaiki opsi mount default beberapa waktu lalu.
mirabilos

Jawaban:

28

Apakah gzip atom?

Tidak. Itu menciptakan file terkompresi dan kemudian menghapus yang asli tidak terkompresi.

Secara khusus, itu tidak memampatkan file di situ dan ada periode waktu saat file sedang dikompresi di mana,

  • target terkompresi tidak lengkap
  • file yang dikompresi sebagian dan sumbernya ada di sistem file.

Apa yang terjadi jika saya menghentikan proses gzip ketika sedang berada di tengah gzipping file?

Jika Anda menghentikan gzipproses dengan sinyal yang dapat ditangkap ( SIGINTdari Ctrl C, misalnya) itu akan membersihkan file yang dibuat sebagian. Kalau tidak, tergantung pada titik di mana ia berhenti, Anda mungkin berakhir dengan sebagian file terkompresi di samping yang asli tidak tersentuh.

Jika bukan atom, jika saya sudah menekan Ctrl + C pada proses gzip * .txt, bagaimana cara melanjutkan dengan aman?

Anda menghapus versi yang dikompresi sebagian (jika masih ada) dan memulai kembali gzip.

roaima
sumber
5
yang ke-2 terjadi ketika proses dihentikan , bukan ketika dihentikan , dan hanya terjadi untuk sinyal yang tidak ditangani (bukan untuk ^ C -> SIGINTatau SIGTERMyang gzipmenginstal penangan sinyal yang menghapus file output).
Mosvy
1
@ Mosvy demikian. Saya belum pernah melihat itu sebelumnya. Terima kasih
roaima
1
Anda sangat berhati-hati untuk memastikan Anda tidak menghapus file yang di-gzip karena file aslinya telah dihapus. Ketika gzip terbunuh secara tidak teratur, itu biasanya satu file, biasanya yang terakhir.
Harper - Pasang kembali Monica
@ Harper ya. Jika Anda berhenti gzippertengahan aliran selalu ada kondisi balapan kecil di sana. Atau Anda dapat gzipselalu mengatakan untuk menimpa file target, yang menghindari sebagian besar masalah pembersihan.
roaima
15

Itu bukan atomik (API sistem file Unix tidak benar-benar menyediakan cara untuk melakukan operasi atom yang memengaruhi banyak file), tetapi itu adalah gagal-aman. File terkompresi adalah file baru, itu tidak menimpa yang asli, dan itu tidak menghapus file asli sampai selesai membuat file terkompresi (ini benar-benar dapat menyebabkan masalah jika Anda tidak memiliki cukup ruang disk untuk kedua file).

Jika mendapat kesalahan atau Anda menghentikan kompresi, file asli akan tetap tidak berubah. Sebagian file terkompresi biasanya akan dihapus.

Tidak ada cara untuk melanjutkannya di tengah, Anda hanya memulainya dari awal.

Barmar
sumber
Ini membuat saya berpikir tentang bagaimana mungkin operasi atom multifile diimplementasikan. Sesuatu seperti transaksi SQL?
val berkata Reinstate Monica
1
@val Sekitar 30 tahun yang lalu saya berada di sebuah tim yang merancang OS baru sebagai tindak lanjut Multics / GCOS, dan sistem file seperti database adalah bagian dari ide tersebut. Proyek ini tidak pernah berjalan sangat jauh.
Barmar
Mereka menghapus transaksi NTFS, tampaknya tidak sebanding dengan komplikasi. Mengganti nama adalah operasi yang paling atomik (selama Anda berada di sistem file yang sama dan memiliki semixik posix), sehingga memiliki pengubahan nama (setelah tutup / fsync) dari temp ke nama akhir akan memastikan file yang tidak terkompresi setidaknya lengkap. Anda dapat mengatasi masalah tersebut dengan menggunakan pipa (yang memiliki mode kegagalan parsial sendiri)
eckes
@ cek Selama menghapus yang asli setelah menutup file yang dikompresi, Anda tidak perlu mengganti nama atom. Jika dokumen asli hilang, Anda dapat memastikan bahwa file yang dikompresi selesai. Anda perlu mengganti nama atom untuk operasi yang mengganti file asli (mis sed -i.).
Barmar
@Barmar jika Anda hanya ingin Memicu keberadaan file target (yang banyak alur kerja pemungutan suara direktori), Anda sebaiknya memastikan file tersebut selesai. Jika Anda tidak memicu itu atau dapat mendeteksi file tidak lengkap dengan memeriksa keberadaan sumber, maka Anda baik-baik saja tanpa mengubah nama akhir.
eckes
4

Anda tidak perlu khawatir tentang hal itu karena gzipmembuat .gzfile baru , mengisinya dengan konten terkompresi, lalu menghapus file asli. Jadi jika Anda menghentikan proses di tengah, itu tidak akan mempengaruhi file asli Anda.

dr_
sumber
3

.txtfile yang sudah berhasil diproses gzipakan diganti dengan .txt.gzfile terkompresi, jadi Anda dapat menjalankannya gzip *.txtkembali dengan aman - hanya file yang belum diproses akan dikompres.

File yang sedang diproses oleh gzip pada saat Anda menekan Ctrl-C akan tidak dimodifikasi - gzip tidak akan menggantinya sampai setelah berhasil mengompresnya.

cas
sumber
0

Tidak, ini sangat tidak biasa. Ini bisa membuat Anda dalam masalah besar jika Anda gzip file yang kadang-kadang ditambahkan, seperti log Web.

Gzip membaca, membuat file .gz (dengan stempel waktu saat ini), menyalin stempel waktu file asli, lalu menghapus yang asli.

Gangguan tertentu dapat meninggalkan file tersesat, yang belum selesai .txt.gztepat di sebelah .txtfile. Ini kemudian menciptakan masalah integritas data: Mana file sebenarnya? Apakah ini

  • gzip yang gagal, meninggalkan yang tidak lengkap / rusak .txt.gz? Atau
  • gunzip yang gagal, meninggalkan .txtfile yang tidak lengkap / terpotong ? Atau
  • File berhasil di-gzip ke dalam txt.gz, dan file yang baru dibuat .txt ?

(Ini yang terakhir terjadi ketika Anda masuk ke direktori log HTTP Anda dan pergi gzip *).

Saya biasanya merasa bijaksana untuk menyelesaikan masalah ini dengan tangan, kecuali Anda tahu persis apa yang terjadi karena Anda baru saja melakukannya.

Untungnya gzip biasanya beroperasi secara serial sehingga Anda hanya akan mengalami masalah ini dengan satu file. Paralel gzip bukan ide yang baik - meskipun itu akan menggunakan CPU lebih penuh, itu akan menghancurkan disk memaksanya untuk membaca beberapa file sekaligus, sangat memperlambat semua gzip. SSD atau RAMdisk, di sisi lain ...

Harper - Pasang kembali Monica
sumber
1
@roaima. Kami benar-benar melakukannya, saya mengandalkan slang yang artinya dulu kami gunakan dulu di satu tempat saya bekerja. Memperbaiki definisi umum.
Harper - Pasang kembali Monica
1
Jika Anda akan melakukan downvote, silakan tinggalkan komentar yang menjelaskan alasannya.
JBentley