Apakah gzip
atom?
Apa yang terjadi jika saya menghentikan gzip
proses ketika sedang gzipping file?
Jika itu bukan atom, dan jika saya sudah menekan Ctrl + C pada suatu gzip *.txt
proses, bagaimana cara melanjutkan dengan aman?
(Saya tidak hanya ingin tahu tentang bagaimana melanjutkan, tetapi juga tentang apakah gzip
secara spesifik adalah atomik.)
command-line
gzip
Vendetta
sumber
sumber
CTRL+Z
alih-alihCTRL+C
, lalu bunuh atau lanjutkan pekerjaan yang terputus (itu menjawab dengan angkan
[-[n]+ Stopped-- gzip ...
] lalu Anda dapat melanjutkan dengan%n
atau denganfg
, atau denganbg
... dengan cara yang sama Anda dapat membunuhnya dengankill %n
).Jawaban:
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,
Jika Anda menghentikan
gzip
proses dengan sinyal yang dapat ditangkap (SIGINT
dari 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.Anda menghapus versi yang dikompresi sebagian (jika masih ada) dan memulai kembali
gzip
.sumber
SIGINT
atauSIGTERM
yanggzip
menginstal penangan sinyal yang menghapus file output).gzip
pertengahan aliran selalu ada kondisi balapan kecil di sana. Atau Anda dapatgzip
selalu mengatakan untuk menimpa file target, yang menghindari sebagian besar masalah pembersihan.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.
sumber
sed -i
.).Anda tidak perlu khawatir tentang hal itu karena
gzip
membuat.gz
file baru , mengisinya dengan konten terkompresi, lalu menghapus file asli. Jadi jika Anda menghentikan proses di tengah, itu tidak akan mempengaruhi file asli Anda.sumber
.txt
file yang sudah berhasil diprosesgzip
akan diganti dengan.txt.gz
file terkompresi, jadi Anda dapat menjalankannyagzip *.txt
kembali 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.
sumber
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.gz
tepat di sebelah.txt
file. Ini kemudian menciptakan masalah integritas data: Mana file sebenarnya? Apakah ini.txt.gz
? Atau.txt
file yang tidak lengkap / terpotong ? Atautxt.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 ...
sumber