Làm thế nào để tìm một tệp lớn đã bị xóa nhưng vẫn mở trong một ứng dụng? Làm thế nào người ta có thể loại bỏ một tập tin như vậy, mặc dù một quá trình đã mở nó?
Tình huống là chúng tôi đang chạy một quy trình đang lấp đầy một tệp nhật ký với tốc độ khủng khiếp. Tôi biết lý do, và tôi có thể sửa nó. Cho đến lúc đó, tôi muốn rm hoặc làm trống tệp nhật ký mà không tắt quá trình.
Đơn giản chỉ cần rm output.log
loại bỏ các tham chiếu đến tệp, nhưng nó tiếp tục chiếm dung lượng trên đĩa cho đến khi quá trình kết thúc. Tệ hơn: sau khi rm
ing tôi không có cách nào để tìm tập tin ở đâu hoặc nó lớn như thế nào! Có cách nào để tìm tệp và có thể làm trống nó, mặc dù nó vẫn đang mở trong một quy trình khác không?
Tôi đặc biệt đề cập đến các hệ điều hành dựa trên Linux như Debian hoặc RHEL.
rm
các tệp ed vẫn đang mở?
lsof | grep "(deleted)"
. Khi không còn quá trình giữ tệp bị xóa mở, kernel sẽ giải phóng các khối inode và đĩa. Các quy trình không có "trình xử lý" mà theo đó chúng có thể được thông báo rằng một tệp mở, về cơ bản bị khóa, đã bị xóa khỏi đĩa.
lsof | grep '(deleted)'
công việc trên Linux là tốt. Trên Linux, bạn có thể được thông báo về việc xóa tệp (ngay cả các tệp đã không có bất kỳ mục nào trong bất kỳ thư mục nào ngoài / Proc / some-pid / fd nữa) với cơ chế inotify (sự kiện IN_DELETE_SELF)
somefile
và mở nó trong VIM, sau đó chỉnh sửa rm
nó trong một quy trình bash khác. Sau đó tôi chạy lsof | grep somefile
và nó không ở đó, mặc dù tệp được mở trong VIM.
lsof -p <pid>
để liệt kê các tệp đang mở và kích thước của chúng. Các tập tin bị xóa sẽ có một(deleted)
bên cạnh nó. Các tập tin bị xóa sẽ được liên kết/proc/<pid>/fd/1
có thể. Tôi không biết làm thế nào để làm cho một quá trình dừng ghi vào bộ mô tả tệp của nó mà không chấm dứt nó. Tôi nghĩ rằng điều đó sẽ phụ thuộc vào quá trình.