Là gzip nguyên tử?


11

gzipnguyên tử?

Điều gì xảy ra nếu tôi dừng gzipquá trình trong khi nó đang ở giữa một tập tin?

Nếu đó không phải là nguyên tử và nếu tôi đã nhấn Ctrl + C trên một gzip *.txtquy trình, làm thế nào để tôi tiếp tục an toàn?

(Tôi không chỉ tò mò về cách tiếp tục, mà còn về việc gzipcụ thể là nguyên tử.)



4
"Làm thế nào để tôi tiếp tục an toàn?" _... Sử dụng CTRL+Zthay vì CTRL+C, sau đó giết hoặc tiếp tục công việc bị gián đoạn (nó trả lời bằng một số n[- [n]+ Stopped-- gzip ...] sau đó bạn có thể tiếp tục với %nhoặc với fghoặc theo bg... bạn có thể giết nó với kill %n).
Hastur

Nén một tệp lớn , Ctrl-C trong khi nén và xem điều gì sẽ xảy ra.
RonJohn

Không. Chỉ mv là nguyên tử, ngoại trừ việc nhỏ giọt châm biếm ext4, nhưng ít nhất họ đã sửa các tùy chọn gắn kết mặc định một thời gian trước đây.
mirabilos

Câu trả lời:


28

Là gzip nguyên tử?

Không. Nó tạo một tệp nén và sau đó loại bỏ bản gốc không nén.

Cụ thể, nó không nén một tệp tại chỗ và có một khoảng thời gian trong khi tệp đang được nén ở đâu,

  • mục tiêu nén không đầy đủ
  • cả tệp nén một phần và nguồn của nó đều tồn tại trong hệ thống tệp.

Điều gì xảy ra nếu tôi dừng quá trình gzip trong khi nó đang ở giữa một tập tin?

Nếu bạn ngăn chặn các gzipquá trình với một tín hiệu catchable ( SIGINTtừ Ctrl C, ví dụ) nó sẽ dọn dẹp một phần tạo ra tập tin. Mặt khác, tùy thuộc vào điểm dừng của nó, bạn có thể kết thúc với một tệp được nén một phần cùng với bản gốc chưa được xử lý.

Nếu nó không phải là nguyên tử, nếu tôi đã nhấn Ctrl + C trên quy trình gzip * .txt, làm thế nào để tôi tiếp tục an toàn?

Bạn xóa phiên bản đã nén một phần (nếu nó vẫn tồn tại) và khởi động lại gzip.


5
lần thứ 2 xảy ra khi quá trình kết thúc , không phải khi nó dừng và chỉ xảy ra đối với các tín hiệu không được xử lý (không phải cho ^ C -> SIGINThoặc SIGTERMđể gzipcài đặt các trình xử lý tín hiệu loại bỏ tệp đầu ra).
mosvy

1
@mosvy vậy nó làm. Tôi chưa bao giờ thấy điều đó trước đây. Cảm ơn bạn
roaima

1
Bạn hết sức cẩn thận để đảm bảo rằng bạn không xóa bất kỳ tệp được nén nào vì bản gốc đã bị xóa. Khi gzip bị giết bất thường, đó thường là một tệp, thường là tệp cuối cùng.
Harper - Phục hồi Monica

@Harper vâng. Nếu bạn dừng gzipdòng giữa thì luôn có một điều kiện cuộc đua nhỏ ở đó. Ngoài ra, bạn có thể yêu cầu gzipluôn ghi đè lên các tệp mục tiêu, điều này vượt qua hầu hết các vấn đề dọn dẹp.
roaima

15

Đó không phải là nguyên tử (hệ thống tập tin API Unix không thực sự cung cấp cách nào để thực hiện các hoạt động nguyên tử có ảnh hưởng đến nhiều file), nhưng nó không an toàn. Tệp nén là một tệp mới, nó không ghi đè lên tệp gốc và nó không xóa tệp gốc cho đến khi hoàn thành việc tạo tệp nén (điều này thực sự có thể gây ra sự cố nếu bạn không có đủ dung lượng đĩa cho cả hai tập tin).

Nếu nó bị lỗi hoặc bạn làm gián đoạn quá trình nén, tệp gốc sẽ không thay đổi. Các tập tin nén một phần thường sẽ được gỡ bỏ.

Không có cách nào để tiếp tục nó ở giữa, bạn chỉ cần bắt đầu lại từ đầu.


Điều này khiến tôi suy nghĩ về cách có thể thực hiện các hoạt động đa nguyên tử có thể được thực hiện. Một cái gì đó giống như giao dịch SQL?
val nói Phục hồi lại

1
@val Khoảng 30 năm trước tôi đã ở trong một nhóm thiết kế một hệ điều hành mới dưới dạng Multics / GCOS và một hệ thống tập tin giống như cơ sở dữ liệu là một phần của ý tưởng. Dự án không bao giờ có được rất xa, mặc dù.
Barmar

Họ đã loại bỏ các giao dịch NTFS, dường như không đáng để phức tạp. Đổi tên là hoạt động nguyên tử nhất (miễn là bạn đang ở trên cùng một hệ thống tệp và nó có ngữ nghĩa posix), do đó, việc đổi tên (sau khi đóng / fsync) từ tên tạm thời sang tên cuối cùng sẽ đảm bảo tệp không bị nén ít nhất là hoàn tất. Bạn có thể giải quyết những vấn đề đó bằng cách sử dụng các đường ống (có chế độ thất bại một phần của riêng chúng)
báo trước

@eckes Miễn là nó xóa bản gốc sau khi đóng tệp nén, bạn không cần đổi tên nguyên tử. Nếu bản gốc không còn nữa, bạn có thể chắc chắn rằng tệp nén đã hoàn tất. Bạn cần đổi tên nguyên tử cho các hoạt động thay thế tệp gốc (ví dụ sed -i).
Barmar

@Barmar nếu bạn chỉ muốn Kích hoạt bởi sự tồn tại của tệp đích (điều mà nhiều quy trình bỏ phiếu thư mục thực hiện), bạn nên chắc chắn rằng tệp đã hoàn tất. Nếu bạn không kích hoạt điều đó hoặc có thể phát hiện các tệp không đầy đủ bằng cách kiểm tra sự tồn tại của nguồn, thì bạn vẫn ổn nếu không đổi tên cuối cùng.
eckes

4

Bạn không cần phải lo lắng về điều đó vì gziptạo một .gztệp mới , điền vào đó với nội dung được nén, sau đó xóa tệp gốc. Vì vậy, nếu bạn dừng quá trình ở giữa, nó sẽ không ảnh hưởng đến tệp gốc của bạn.


3

.txtcác tệp đã được xử lý thành công gzipsẽ được thay thế bằng .txt.gzcác tệp nén, do đó bạn có thể chạy gzip *.txtlại một cách an toàn - chỉ các tệp chưa được xử lý mới được nén.

Tập tin đang được xử lý bởi gzip tại thời điểm bạn nhấn Ctrl-C sẽ không được sửa đổi - gzip sẽ không thay thế nó cho đến khi nén thành công.


0

Không, nó rất không bình thường. Điều này có thể khiến bạn gặp rắc rối lớn nếu bạn gzip một tệp đôi khi được thêm vào, như nhật ký Web.

Gzip đọc, tạo tệp .gz (với dấu thời gian hiện tại), sao chép dấu thời gian của tệp gốc, sau đó xóa bản gốc.

Một số gián đoạn có thể để lại một .txt.gztệp chưa hoàn thành, chưa hoàn thành ngay bên cạnh .txttệp. Điều này sau đó tạo ra một vấn đề toàn vẹn dữ liệu: đó là tập tin thực sự? Có phải đây là

  • một gzip không thành công, để lại một không đầy đủ / bị hỏng .txt.gz? Hoặc là
  • một gunzip thất bại, để lại một .txttập tin không đầy đủ / bị cắt ? Hoặc là
  • Một tệp được nén thành công txt.gzvà một tệp mới được tạo .txt ?

(Điều này cuối cùng xảy ra khi bạn vào thư mục nhật ký HTTP và đi gzip *).

Tôi thường thấy thật khôn ngoan khi sắp xếp nó bằng tay, trừ khi bạn biết chính xác những gì đã xảy ra bởi vì bạn vừa mới làm nó.

May mắn thay, gzip thường hoạt động ổn định, do đó bạn chỉ gặp vấn đề này với một tệp. Song song gzip không phải là một ý tưởng hay - mặc dù nó sẽ sử dụng CPU đầy đủ hơn, nhưng nó sẽ đập đĩa buộc nó phải đọc nhiều tệp cùng một lúc, làm chậm rất nhiều tất cả các gzip. SSD hoặc RAMdisk, mặt khác ...


1
@roaima. Chúng tôi thực sự, tôi đã dựa vào một tiếng lóng có nghĩa là chúng ta đã từng sử dụng từ lâu tại một nơi tôi làm việc. Sửa theo định nghĩa chung.
Harper - Phục hồi Monica

1
Nếu bạn sẽ downvote xin vui lòng để lại một bình luận giải thích lý do tại sao.
JBentley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.