Tôi có một tập tin đã bị xóa, nhưng vẫn được mở bởi một chương trình. Tôi tìm thấy số inode bằng lsof. Làm thế nào tôi có thể tạo một liên kết cứng trở lại inode đó?
Tôi có một tập tin đã bị xóa, nhưng vẫn được mở bởi một chương trình. Tôi tìm thấy số inode bằng lsof. Làm thế nào tôi có thể tạo một liên kết cứng trở lại inode đó?
Câu trả lời:
Bạn không thể tạo một liên kết đến nó, nhưng bạn có thể lấy lại nó. Hãy làm một thí nghiệm:
$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt
myfile.txt hiện đã biến mất, nhưng inode được giữ nguyên bởi lệnh tail. Để lấy lại tệp của bạn, trước tiên hãy tìm PID của quá trình giữ nút inode:
$ ps auxw | grep tail
sunny 409 0.0 0.0 8532 824 pts/5 S 18:07 0:00 tail -f myfile.txt
PID là 409. chdir đến / Proc / 409 / fd / và liệt kê nội dung:
dr-x------ 2 sunny sunny 0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny 0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)
Các thư mục / Proc / [PID] / fd / chứa các liên kết tượng trưng đến các mô tả tệp của tất cả các tệp mà quá trình sử dụng. Trong trường hợp này, symlink "3" trỏ đến tệp đã xóa. Vì vậy, để khôi phục tệp, sao chép nội dung sang tệp mới:
$ cat 3 >/home/mydir/saved_file.txt
để lấy toàn bộ tập tin nếu nó vẫn được viết để thử tail -c +1 -f
từ: /unix/25527/how-to-follow-a-la-tail-fa-binary-file-from-the-beginning
(btw: ln từ fd on / Proc không hoạt động, chỉ cần thử nó)
Không có cách di động để làm điều này trong Linux. Cách tốt nhất có lẽ là khiến tất cả hoạt động trên hệ thống tệp ngừng hoạt động, giết chương trình giữ tệp mở, ngắt kết nối hệ thống tệp và sử dụng trình gỡ lỗi hệ thống tệp để đính kèm lại vào thư mục. Nếu bạn có hệ thống tệp được xuất qua NFS, ít nhất một số phiên bản của NFS có thể cho phép bạn đọc dữ liệu tệp trên NFS.