Làm thế nào để cp cp cp xử lý các tập tin mở?


15

Tôi có hai thư mục riêng biệt. Người dùng tải một tập tin vào đầu tiên. Có một cronjob chạy trong nền sao chép các tệp cứ sau 5 phút vào thư mục thứ hai.

Điều gì xảy ra nếu người dùng chưa hoàn thành việc tải lên của mình và cronjob sao chép các tệp? Lưu ý rằng hai thư mục được sở hữu bởi những người dùng khác nhau, cronjob được thực hiện dưới quyền root.


vui lòng đọc bài đăng này để xem điều gì xảy ra trong trường hợp như vậy: unix.stackexchange.com/questions/49299/ mẹo
Serge

Cảm ơn, bài viết tốt bạn đã viết. Nhưng câu hỏi của tôi liên quan đến cp nhiều hơn, không phải là xử lý tập tin linux nói chung. Tôi mặc dù có thể cp kiểm tra nếu tập tin vẫn mở và đợi cho đến khi nó đóng hoặc một cái gì đó.
ngột ngạt

Số cpsẽ không đợi cho đến khi tập tin được tải lên hoàn toàn. Vì chúng tôi hy vọng rằng tốc độ truyền mạng thấp hơn so với việc chỉ sao chép tệp từ vị trí này sang vị trí khác trong cùng một máy chủ, sau đó tại một thời điểm nào đó cpsẽ đến phần cuối của tệp hiện tại và sẽ dừng sao chép. Giải pháp cho vấn đề của bạn có thể đơn giản: đầu tiên người dùng tải lên tệp với một số tên tệp được xử lý đặc biệt (ví dụ: được đặt trước .(ký tự dấu chấm). Khi chuyển xong, người dùng sẽ đổi tên thành tên gốc. cho các tệp không bắt đầu ..
Serge

Câu trả lời:


17

cpkhông biết về các tập tin đã mở. Vì vậy, nếu người dùng đầu tiên tải lên tệp lớn và cronjob (hoặc bất kỳ quy trình nào khác) bắt đầu sao chép tệp này, nó sẽ chỉ sao chép nhiều như đã được viết. Bạn có thể nghĩ về điều này theo cách này - cptạo bản sao của những gì hiện có trên đĩa, bất kể tập tin đã hoàn tất chưa. Nếu không, bạn không thể sao chép các tệp nhật ký chẳng hạn.


Cảm ơn, đó là những gì tôi muốn biết! Có một cách đơn giản để tránh điều đó? Tôi đã kiểm tra trang người đàn ông cp nhưng không tìm thấy gì.
ngột ngạt

Để làm gì chính xác? Để sao chép tất cả các tập tin ngoại trừ những tập tin mở? Tôi không nghĩ có bất kỳ cách dễ dàng nào để làm điều này (ngoài việc viết kịch bản của riêng bạn sử dụng fuser+ cp. Bản sao như vậy sẽ rất không đáng tin. Nó sẽ không sao chép bất kỳ tệp nào được mở trong trình soạn thảo văn bản.
Krzysztof Adamski

@Stuffy, có thể trong cronjob của bạn, bạn có thể liệt kê các tệp đang mở với lsof? Đầu ra của điều đó có nghĩa là dễ dàng để xử lý. Bạn có thể lọc các tệp đang được mở (ví dụ: bằng một ví dụ cp) để ghi.
Wojtek Rzepala

@WojtekRzepala, tôi sẽ xem xét điều này, cảm ơn. Có lẽ tôi sẽ viết một kịch bản nhỏ được thực hiện bởi cronjob
ngột ngạt

@Stuffy: Hãy nhớ rằng nó có thể không thực sự đáng tin cậy nếu nó không được chạy bởi người dùng root ( fusertất nhiên vấn đề tương tự ) vì công cụ này có thể không hiển thị tất cả các tệp.
Krzysztof Adamski

7

cpkhông biết những chương trình khác có thể mở tập tin. Không có phép thuật trong cp. Thiết kế của unix cố tình tránh đặt bất kỳ loại khóa nào vào các tệp trừ khi có một lý do thuyết phục (nghĩa là hạt nhân cần nó). Trong chủ đề này, hãy xem Liệu chuyển hướng đầu ra đến một tệp có áp dụng khóa trên tệp không?

Những tình huống như vậy, trong đó một tập tin được sản xuất bởi nhà sản xuất và, sau khi hoàn thành, được tiêu thụ bởi người tiêu dùng, là phổ biến. Cách thông thường để xử lý việc này là yêu cầu nhà sản xuất viết một tệp tạm thời mà người tiêu dùng sẽ không tìm kiếm, sau đó khi nhà sản xuất kết thúc, hãy chuyển tệp vào nơi mà người tiêu dùng sẽ tìm thấy. Di chuyển một tệp (trên cùng một hệ thống tệp) là một hoạt động nguyên tử: tại một số điểm, đối với người tiêu dùng, tệp sẽ thay đổi từ không tồn tại ở đó.

Vì vậy, sắp xếp cho công việc tải lên của bạn để di chuyển các tệp đến một thư mục khác khi hoàn thành việc tải lên. Chỉ công việc cron tại thư mục khác nhau này.


6

Có vẻ như bạn muốn làm một công việc đồng bộ hóa dir.

Bởi vì tùy chọn -u, --update củacp

chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu

Vì vậy, bạn có thể thêm một cronjob như cp -auv SOURCEDIR/* DESTDIRsẽ sao chép những tệp có thời gian sửa đổi đã thay đổi. Điều đó có nghĩa là DESTDIRcuối cùng sẽ có được bản sao hoàn chỉnh trong khi quá trình tải lên đã kết thúc.

rsynccó thể làm cùng một công việc ví dụ,rsync -av SOURCEDIR/ DESTDIR .

Mặc dù tùy chọn -a được áp dụng, một số thuộc tính được chỉ định (ví dụ: quyền sở hữu) chỉ có thể được duy trì bởi siêu người dùng.

Xem man cp, man rsyncđể biết chi tiết.


Chỉ cần cẩn thận khi dựa vào các mục gần đây trong thư mục đích --- chúng có thể không phải là tệp hoàn chỉnh.
dubiousjim
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.