Làm thế nào để các tập tin mở hoạt động trên hệ thống linux?


17

Tôi vừa đổi tên một tệp nhật ký thành "foo.log.old" và cho rằng ứng dụng sẽ bắt đầu viết một logfile mới tại "foo.log". Tôi đã rất ngạc nhiên khi phát hiện ra rằng nó đã theo dõi logfile với tên mới của nó và tiếp tục nối các dòng vào "foo.log.old".

Trong Windows, tôi không quen thuộc với loại hành vi này - tôi không biết liệu thậm chí có thể thực hiện nó hay không. Làm thế nào chính xác là hành vi này được thực hiện trong linux? Tôi có thể tìm hiểu thêm về nó ở đâu?


Tôi không đặt câu trả lời này vì tôi thực sự không biết nhưng tôi nghĩ nó phải làm với các nút không bị thay đổi khi bạn di chuyển tệp.
toán học

Câu trả lời:


20

Các chương trình kết nối với các tệp thông qua một số được duy trì bởi hệ thống tệp (được gọi là inode trên các hệ thống tệp unix truyền thống), mà tên này chỉ là một tham chiếu (và có thể không phải là một tham chiếu duy nhất tại đó).

Vì vậy, một số điều cần lưu ý:

  1. Di chuyển tệp bằng cách sử dụng mvkhông thay đổi số dưới mức đó trừ khi bạn di chuyển tệp qua các hệ thống tệp (tương đương với việc sử dụng cpsau đó rmtrên bản gốc).
  2. Vì có nhiều hơn một tên có thể kết nối với một tệp duy nhất (nghĩa là chúng tôi có các liên kết cứng), dữ liệu trong các tệp "đã xóa" sẽ không biến mất cho đến khi tất cả các tham chiếu đến tệp dưới quyền biến mất.
  3. Có lẽ quan trọng nhất: khi một chương trình opensa tập tin, nó tạo một tham chiếu đến nó (vì mục đích khi dữ liệu sẽ bị xóa) tương đương với việc có một tên tệp được kết nối với nó.

Điều này dẫn đến một số hành vi như:

  • Một chương trình có thể openlà một tệp để đọc, nhưng không thực sự đọc nó cho đến khi người dùng chỉnh sửa rmnó ở dòng lệnh và chương trình vẫn sẽ có quyền truy cập vào dữ liệu .
  • Cái bạn gặp phải: mving một tập tin không ngắt kết nối mối quan hệ giữa tập tin và bất kỳ chương trình nào mở nó (trừ khi bạn di chuyển qua ranh giới hệ thống tập tin, trong trường hợp đó chương trình vẫn có phiên bản gốc để làm việc).
  • Nếu một chương trình đã chỉnh sửa openmột tệp để ghi và rmtên tệp cuối cùng của người dùng đó là dòng lệnh, chương trình có thể tiếp tục đưa nội dung vào tệp, nhưng ngay khi đóng, sẽ không có thêm tham chiếu đến dữ liệu đó và nó sẽ biến mất
  • Hai chương trình giao tiếp qua một hoặc nhiều tệp có thể có được bảo mật thô, một phần bằng cách xóa (các) tệp sau khi hoàn tất open. (Đây không phải là tâm trí bảo mật thực tế , nó chỉ biến một lỗ hổng thành điều kiện cuộc đua.)

1
Tôi đồng ý với @dmckee, tôi chỉ muốn lưu ý: một chương trình có thể openlà một tệp để đọc và viết (như những gì đã xảy ra với tệp nhật ký trong câu hỏi).
jsbillings

@jsbillings: Có, nhưng có rủi ro. Nếu tất cả các tên hệ thống tập tin đã biến mất, bạn có thể ghi GB vào một tệp đang mở sẽ bốc hơi như sương buổi sáng ngay khi bạn đóng nó.
dmckee

1
Ngoài ra, inode được sao chép vào kernel và đó là những gì được vận hành trên, không phải là bản sao đĩa. Vì vậy, tệp có thể là mv'd hoặc cp ', nhưng một tệp đang mở đã hoạt động với các quy tắc dữ liệu hạt nhân, không phải là phiên bản đĩa. Vì vậy, nếu bạn sao chép một tệp khác vào tệp đang mở để ghi, quá trình vẫn sẽ ghi vào vị trí tương đối giống như trong tệp cũ. Đây là lý do tại sao các chương trình, như Apache httpd, có trình xử lý tín hiệu để đóng và mở lại các tệp nhật ký.
Arcege

0

Để thực sự thấy hành vi này được thực hiện như thế nào, bạn có thể xem một số sách lập trình Unix. Mathepic đúng ở chỗ nó có liên quan đến một nút. Tên đường dẫn thực tế chỉ được sử dụng để mở tệp, sau khi thực hiện xong chương trình tham chiếu nó bằng mô tả tệp đã mở. Bộ mô tả tệp lần lượt tham chiếu inode, trong trường hợp này không quan tâm nếu tên tệp bên dưới đã thay đổi.

Theo như thực hiện điều này trong Windows, đó là một câu hỏi cho một trang web khác.

Để đọc thêm về điều này mà không cần nhấn vào các cuốn sách, chỉ cần tìm kiếm xung quanh các hệ thống tập tin và inodes linux. Có thể không có câu trả lời rõ ràng, nhưng bạn sẽ có thể hiểu tại sao.


4
"Tìm kiếm xung quanh - có thể bạn sẽ không tìm thấy câu trả lời hay nhưng sẽ hiểu nó" không phải là một câu trả lời hay.
mattdm
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.