Điều gì xảy ra khi tôi giết 'cp'? Có an toàn và nó có bất kỳ hậu quả?


23

Hậu quả cho hệ thống tập tin ext4 là gì khi tôi chấm dứt cplệnh sao chép bằng cách gõ Ctrl+ Ctrong khi nó đang chạy?

Hệ thống tập tin có bị hỏng không? Là không gian của phân vùng bị chiếm bởi tập tin sao chép không đầy đủ vẫn có thể sử dụng được sau khi xóa nó?

Và, quan trọng nhất, là chấm dứt một cpquá trình là một điều an toàn để làm?


1
Hãy nhớ rằng trong khi các câu trả lời là chính xác cho ext4, các hệ thống tệp mà không ghi nhật ký có thể không an toàn.
Ave

3
@Ave Nhật ký không có gì để làm với điều này. Các tòa nhà là nguyên tử bất kể bạn sử dụng hệ thống tập tin nào. Viết nhật ký rất hữu ích trong các tình huống có thể mất điện đột ngột.
rừng

Câu trả lời:


22

Điều này là an toàn để làm, nhưng tự nhiên bạn có thể chưa hoàn thành bản sao.

Khi cplệnh được chạy, nó tạo ra các tòa nhà hướng dẫn kernel tạo các bản sao của tệp. Tòa nhà chọc trời là một chức năng mà một ứng dụng có thể gọi yêu cầu dịch vụ từ kernel, chẳng hạn như đọc hoặc ghi dữ liệu vào đĩa. Quá trình không gian người dùng chỉ đơn giản là chờ tòa nhà kết thúc. Nếu bạn theo dõi các cuộc gọi, nó sẽ trông giống như:

open("/home/user/hello.txt", O_RDONLY)           = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644)   = 4
read(3, "Hello, world!\n", 131072)               = 14
write(4, "Hello, world!\n", 14)                  = 14
close(3)                                         = 0
close(4)                                         = 0

Điều này lặp lại cho mỗi tệp sẽ được sao chép. Sẽ không có tham nhũng xảy ra vì cách thức hoạt động của các tòa nhà này. Khi các tòa nhà như thế này được đưa vào, tín hiệu gây tử vong sẽ chỉ có hiệu lực sau khi tòa nhà đã hoàn thành , không phải trong khi nó đang chạy. Bởi vì điều này, việc giết chết quá trình sẽ chỉ khiến nó chấm dứt sau khi tòa nhà hiện đang chạy xong. Điều này có nghĩa là kernel, nơi trình điều khiển hệ thống tập tin sống, có thể tự do hoàn thành các hoạt động mà nó cần hoàn thành để đưa hệ thống tập tin vào trạng thái lành mạnh. Bất kỳ I / O loại này sẽ không bao giờ bị chấm dứt ở giữa hoạt động, biến chúng thành các hoạt động nguyên tử.

Thật thú vị, đây là lý do tại sao các lệnh như cpcó thể không chấm dứt ngay lập tức khi chúng bị giết. Nếu bạn đang sao chép một tệp rất lớn và giết nó, ngay cả với SIGKILL, quá trình này vẫn sẽ chạy cho đến khi tòa nhà hiện tại kết thúc. Với một tệp lớn, việc này có thể mất một lúc, vì quá trình sẽ ở trạng thái không bị gián đoạn.


2
@qwr Đó rất có thể là một phần của thư viện glibc, không phải là cpchính nó. Nó có các hàm truy cập tệp khác nhau sử dụng nội bộ đó làm giá trị.
rừng

2
Câu trả lời chính xác! Tôi chưa bao giờ nhận ra rằng có một sự chậm trễ trong việc chấm dứt cpsau khi SIGKILL nó, ngay cả khi xử lý các tệp lớn ... có thể thời gian của các hoạt động nguyên tử không bị gián đoạn của một quá trình là quá ngắn. Liệu giải thích tương tự có làm việc cho việc tiêu diệt ddvà các quá trình đọc / ghi đĩa khác không?
Seninha

1
@Seninha Các thao tác khá ngắn gọn vì các truy cập được lưu trong bộ nhớ cache, do đó bạn có thể sao chép nhiều dữ liệu hơn mỗi giây so với ổ đĩa của bạn thực sự có thể xử lý, nếu được thực hiện theo cụm. Nếu tệp thực sự lớn và trên phương tiện chậm, thì bộ đệm có thể lấp đầy và giết quá trình có thể mất một thời gian. Đối với việc giết chóc dd, điều đó phụ thuộc vào những gì bsbạn đặt ra cho nó. Nếu chỉ có 512 (mặc định), thì nó sẽ chấm dứt nhanh chóng. Nếu nó lớn hơn, thì có thể lâu hơn một chút.
rừng

3
@qwr Các khối 128kb được mặc định cứng trong coreutils khi đọc từ blockdevices, điều này được thực hiện trong nỗ lực để giảm thiểu các tòa nhà. Phân tích được đưa ra trong nguồn coreutils: git.savannah.gnu.org/cgit/coreutils.git/tree/src/ioblksize.h
Fiisch

1
@AndrewHenle Có lẽ tôi nên nói rằng đó là siêu dữ liệu hệ thống tập tin là nguyên tử. Bạn đúng rằng một bài viết có thể là một phần.
rừng

20

cplà một lệnh không gian người dùng, điều này không ảnh hưởng đến tính toàn vẹn của hệ thống tập tin.

Tất nhiên bạn cần phải chuẩn bị rằng ít nhất một tệp sẽ không được sao chép hoàn toàn nếu bạn giết cpchương trình đang chạy.


14
Tại sao các downvote? Chỉ vì nó ngoan ngoãn?
Stephen Kitt

6
Dường như có ít nhất một người hạ thấp tất cả các câu trả lời của tôi. Bạn có biết một cách để tìm ra ai đã làm downvote không?
schily

2
Ngay cả những người điều hành cũng không thể tìm ra ai đã bỏ phiếu cụ thể - điều đó bị hạn chế một cách dễ hiểu đối với nhân viên SO. Bạn có thể sử dụng liên kết "liên hệ với chúng tôi" để yêu cầu họ điều tra.
Philip Kendall

1
Sẽ rất buồn nếu một chương trình không gian người dùng có thể ảnh hưởng đến tính toàn vẹn của hệ thống tệp. Lưu ý: Tất nhiên, có thể có , đã có và sẽ có lỗi trong việc triển khai hệ thống tập tin. Lưu ý # 2: Tất nhiên, tất nhiên, các chương trình không gian người dùng đang chạy với các đặc quyền nâng cao (ví dụ: CAP_SYS_RAWIOtrong Linux hoặc tương đương trong các HĐH khác) cho phép họ truy cập trực tiếp vào thiết bị cơ bản của hệ thống tệp (ví dụ sudo dd if=/dev/urandom of=/dev/sda1) có thể phá hỏng tất cả các loại sự tàn phá.
Jörg W Mittag

3
Và nếu một hệ thống tập tin bị lỗi đủ để bị hỏng sau khi bị gián đoạn cp, nó có thể sẽ bị hỏng từ cpquá trình hoàn thành ...
ilkkachu
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.