2009-02-26 32 views
8

Tôi muốn mở một tệp được viết theo định kỳ bởi một ứng dụng khác. Không thể sửa đổi ứng dụng này. Do đó, tôi muốn chỉ mở tệp khi tôi biết nó không được viết bởi một ứng dụng khác.Python - Cách kiểm tra xem tệp có được ứng dụng khác sử dụng không?

Có cách nào để làm điều này không? Nếu không, làm thế nào để tôi đạt được điều này trong Unix và Windows?

chỉnh sửa: Tôi sẽ cố gắng làm rõ. Có cách nào để kiểm tra xem tệp hiện có đã được mở bởi một ứng dụng khác không?

Tôi muốn bắt đầu với câu hỏi này. Cho dù những ứng dụng đọc/ghi khác không liên quan đến bây giờ.

Tôi nhận ra nó có lẽ là hệ điều hành phụ thuộc, vì vậy điều này có thể không thực sự là python liên quan ngay bây giờ.

+0

bạn đang cố gắng đạt được xoay vòng nhật ký ?? – vladr

+0

Không chính xác, nhưng không quá xa. Tôi muốn xây dựng một ứng dụng trên đầu trang của một ứng dụng hiện có. –

Trả lời

7

Tập lệnh python của bạn có muốn mở tệp để viết hoặc đọc không? Ứng dụng kế thừa có mở và đóng tệp giữa các lần viết hay nó vẫn giữ nó mở?

Điều cực kỳ quan trọng là chúng tôi hiểu ứng dụng cũ đang làm gì và kịch bản python của bạn đang cố gắng đạt được điều gì.

Khu vực chức năng này phụ thuộc vào hệ điều hành cao và thực tế là bạn không có quyền kiểm soát ứng dụng cũ chỉ khiến mọi thứ trở nên khó khăn hơn. Cho dù có một cách thức nhiệt tình hay không thiên vị để làm điều này có lẽ sẽ là ít nhất mối quan tâm của bạn - câu hỏi khó sẽ là liệu những gì bạn đang cố đạt được sẽ có thể xảy ra hay không.


CẬP NHẬT

OK, vì vậy biết (từ bình luận của bạn) rằng:

ứng dụng di sản được mở và đóng mỗi X phút tập tin, nhưng tôi không muốn giả định rằng tại t = t_0 + n * X + eps nó đã đóng tệp.

thì thông số của sự cố được thay đổi. Nó thực sự có thể được thực hiện theo cách độc lập với hệ điều hành được đưa ra một vài giả định, hoặc như là một sự kết hợp của các kỹ thuật phụ thuộc vào hệ điều hành và các hệ điều hành độc lập. :)

  1. OS độc lập cách: nếu nó là an toàn để giả định rằng ứng dụng di sản giữ các tập tin mở trong ít nhất một số lượng đã biết về thời gian, nói T giây (ví dụ mở tập tin, thực hiện một ghi , sau đó đóng tệp) và mở lại nhiều hơn hoặc ít hơn sau mỗi X giây, trong đó X lớn hơn 2 * T.
    • stat file
    • trừ thời gian chỉnh sửa tập tin từ now(), năng suất D
    • nếu T < = D < X sau đó mở tập tin và làm những gì bạn cần với nó
    • này có thể đủ an toàn cho ứng dụng của bạn. Mức tăng an toàn khi giảm T/X. Trên * nix, bạn có thể phải kiểm tra lại số /etc/ntpd.conf để có cấu hình đúng bước so với xoay vòng (xem tinker). Đối với Windows thấy MSDN
  2. của Windows: ngoài (hoặc in-thay) của phương pháp OS độc lập ở trên, bạn có thể cố gắng sử dụng một trong hai:
    • chia sẻ (khóa): này giả định rằng chương trình kế thừa cũng mở tệp ở chế độ được chia sẻ (thường là mặc định trong các ứng dụng Windows); hơn nữa, nếu ứng dụng của bạn có được khóa giống như ứng dụng cũ đang cố gắng giống nhau (điều kiện chủng tộc), ứng dụng kế thừa sẽ thất bại.
      • điều này vô cùng xâm phạm và dễ xảy ra lỗi. Trừ khi cả ứng dụng mới và ứng dụng cũ cần truy cập đồng bộ để ghi vào cùng một tệp và bạn sẵn sàng xử lý khả năng ứng dụng cũ bị từ chối mở tệp, không sử dụng phương thức này.
    • cố gắng để tìm ra những file được mở trong ứng dụng di sản, sử dụng kỹ thuật tương tự như ProcessExplorer (tương đương với * nix của lsof)
      • bạn thậm chí còn dễ bị tổn thương hơn đối với điều kiện chủng tộc hơn OS- kỹ thuật độc lập
  3. Linux/etc.: ngoài (hoặc in-thay) của phương pháp OS độc lập ở trên, bạn có thể cố gắng sử dụng các kỹ thuật tương tự như lsof hay, trên một số hệ thống, bạn chỉ cần kiểm tra những file liên kết tượng trưng /proc/<pid>/fd/<fdes> điểm để
    • bạn nó thậm chí còn dễ bị tổn thương hơn trong điều kiện chủng tộc so với kỹ thuật độc lập của hệ điều hành
    • rất khó xảy ra khi ứng dụng cũ sử dụng khóa, nhưng nếu khóa đó không phải là một lựa chọn thực sự trừ khi ứng dụng cũ có thể xử lý tệp bị khóa một cách duyên dáng chặn, không phải do thất bại - và nếu ứng dụng của riêng bạn có thể đảm bảo rằng tệp sẽ không bị khóa, hãy chặn ứng dụng cũ trong khoảng thời gian mở rộng.)

UPDATE 2

Nếu thiên về sự "kiểm tra xem các ứng dụng di sản có các tập tin mở" (phương pháp xâm nhập dễ bị đua điều kiện) sau đó bạn có thể giải quyết cuộc đua nói điều kiện bởi:

  1. kiểm tra xem ứng dụng cũ có mở tệp hay không (a la lsof hoặc ProcessExplorer)
  2. tạm dừng quá trình đăng ký cũ
  3. lặp lại bước kiểm tra ở bước 1 để xác nhận rằng ứng dụng cũ không mở tệp giữa các bước 1 và 2; trì hoãn và khởi động lại ở bước 1 nếu có, hãy tiếp tục đến bước 4
  4. thực hiện việc kinh doanh của bạn trên tệp - lý tưởng chỉ cần đổi tên nó để xử lý độc lập tiếp theo để giữ ứng dụng cũ bị tạm ngưng trong một khoảng thời gian tối thiểu
  5. tiếp tục lại quy trình đăng ký cũ
+0

Ứng dụng kế thừa đang mở và đóng tệp mỗi X phút, nhưng tôi không muốn giả định rằng tại t = t_0 + n * X + eps nó đã đóng tệp. –

0

Unix không có khóa tệp làm mặc định. Đề xuất tốt nhất mà tôi có cho môi trường Unix là xem xét các nguồn cho lệnh lsof. Nó có kiến ​​thức sâu sắc về quy trình nào có tệp nào mở. Bạn có thể sử dụng nó làm cơ sở cho giải pháp của bạn. Dưới đây là Ubuntu sources for lsof.

+0

Điều này có vẻ như nó có thể là một giải pháp tốt trên Unix. Tôi chỉ có thể phân tích đầu ra của lsof cho tập tin tôi cần trước khi truy cập nó. Không hoàn toàn an toàn mà không có khóa, nhưng tôi có thể xử lý đúng chỉ trong 99,99% các trường hợp. Tôi chỉ cần một giải pháp cho Windows. –

0

Một điều tôi đã làm là có python tạm thời đổi tên tệp. Nếu chúng ta có thể đổi tên nó, thì không có quá trình nào khác đang sử dụng nó. Tôi chỉ thử nghiệm điều này trên Windows.

+1

Cụm từ "tình trạng cuộc đua" được ghi nhớ: - / –

Các vấn đề liên quan