Xóa một tập tin mơ hồ tôi thấy .nfs0000000000b869e300000001


15

Tôi đã xóa một tập tin và bây giờ tôi thấy:

$ ls
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502   238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502   170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion

và nếu tôi cố gắng loại bỏ nó:

$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy

Điều này cho thấy gì? Tôi nên làm gì


Vấn đề này, kết hợp với lỗi dịch vụ âm thanh chỉ báo này , trong đó hàng trăm quy trình giữ cho các tệp được mở, kết hợp với các vấn đề như thế này khi các bản ghi ~ / .cache / upstart phát triển rất lớn và sau đó bị nén, chiếm rất nhiều không gian trong tôi ổ đĩa NFS của công ty bao gồm thư mục nhà của tôi. Làm việc xung quanh nó bằng cách thêm ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs killvào crontab -e.
Andres Riofrio

Câu trả lời:


14

Một tập tin có thể bị xóa trong khi nó được mở bởi một quá trình. Khi điều này xảy ra, mục nhập thư mục sẽ bị xóa, nhưng chính tệp (inode và nội dung) vẫn ở phía sau; tập tin chỉ thực sự bị xóa khi nó không còn liên kết nữa và nó không được mở bởi bất kỳ quá trình nào.

NFS là một giao thức phi trạng thái: các hoạt động có thể được thực hiện độc lập với các hoạt động trước đó. Máy chủ thậm chí có thể khởi động lại và khi nó trở lại trực tuyến, các máy khách sẽ tiếp tục truy cập các tệp như trước đây. Để làm việc này, các tệp phải được chỉ định bằng tên của chúng, không phải bằng cách xử lý thu được bằng cách mở tệp (mà máy chủ sẽ quên khi khởi động lại).

Đặt hai cái lại với nhau: điều gì xảy ra khi một tệp được mở bởi một khách hàng và bị xóa? Các tập tin cần phải có tên, để khách hàng mở nó vẫn có thể truy cập nó. Nhưng khi một tệp bị xóa, dự kiến ​​sẽ không còn tệp nào có tên đó tồn tại sau đó. Vì vậy, các máy chủ NFS biến việc xóa một tệp đang mở thành đổi tên: tệp được đổi tên thành .nfs…( .nfstheo sau là một chuỗi các chữ cái và chữ số).

Bạn không thể xóa các tệp này (nếu bạn thử, tất cả những gì xảy ra là một cái mới .nfs…xuất hiện với một hậu tố khác). Cuối cùng họ sẽ biến mất khi máy khách mở tệp sẽ đóng nó. (Nếu máy khách biến mất trước khi đóng tệp, có thể mất một lúc cho đến khi máy chủ thông báo.)


2

Người dùng @mtak trong một câu hỏi khác gợi ý:

You could try runningfuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

ví dụ

$ rm -rf ~/Downloads
rm: cannot remove ‘/nfshome/x/Downloads’: Directory not empty
$ ls -alstr ~/Downloads
total 38864
  972 -rw-r--r--   1 x users   988438 Dec 20  2016 .nfs00000000018d307a00000369
31812 -rw-r--r--   1 x users 32503812 Dec 20  2016 .nfs00000000018d307f0000036b
  636 drwx--x--x 134 x y   647168 Aug 28 10:37 ..
  240 drwxr-xr-x   2 x y   241664 Aug 28 10:43 .
$ rm -rf ~/Downloads
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307a00000369’: Device or resource busy
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307f0000036b’: Device or resource busy

$ fuser /nfshome/x/Downloads/.nfs00000000018d307400000367
/nfshome/x/Downloads/.nfs00000000018d307400000367:  8231m
$ ps -elf |grep 8231
0 S x     1493 15153  0  80   0 - 28177 pipe_w 10:55 pts/39   00:00:00 grep --color=auto 8231
0 S x     8231  7660  0  99   - - 481464 poll_s Jul19 ?       00:06:01 /usr/libexec/tracker-extract
$ kill 8231
$ kill 8231 # kill twice to check first kill worked, . . 
            # escalate to kill -9 8231 if first kill didn't work, . . 
            # use sudo or root or other user to kill if ownership prevents kill working.
-bash: kill: (8231) - No such process
$ rm -rf ~/Downloads

$ ls -alstr ~/Downloads/
ls: cannot access /nfshome/x/Downloads/: No such file or directory

YAY! Sự thành công.

YMMV tất nhiên. Nó có thể là một quá trình khác nhau với việc mở tệp.

Quá trình trích xuất theo dõi được tự động khởi động lại sau khi tôi giết nó.

Điều này theo dõi trích xuất là gì? (Tôi thấy điều này trên centos / redhat)

/programming/26737900/tracker-extract-and-tracker-store- Processes-consuming-huge-amount-of-ram

extra/tracker 1.2.3-1 (gnome)
    All-in-one indexer, search tool and metadata database

1
Hữu ích hơn nhiều so với câu trả lời được chấp nhận, vì nó cung cấp cho người dùng cách khắc phục tình trạng này.
chb

1

Vì NFS là "không trạng thái", cần có một cách để mô phỏng phương pháp UNIX để mở tệp và sau đó loại bỏ nó giữ một tệp mở.

Bất kỳ hoạt động tập tin NFS gây ra chuỗi:

open(); seek-last-off(); doit(); close();

được chạy và đây là lý do tại sao NFS sống sót khi khởi động lại máy chủ.

Khi quá trình trên máy khách mở tệp cũ kết thúc, tệp sẽ biến mất.

Các trình tạo tệp được triển khai chính xác sẽ chạy một tập lệnh mỗi đêm, loại bỏ tất cả các tệp cũ hơn một tuần. Lý do là trong trường hợp máy khách khởi động lại trong khi giữ một tệp như vậy, tệp sẽ tồn tại mãi mãi.


0

Một số quy trình khác có khả năng vẫn đang sử dụng tệp (nghĩa là có tệp mở cho nó). Hoặc bỏ qua tệp, hoặc sử dụng lsofhoặc muốn tìm quá trình mở tệp đó (hoặc khởi động lại mọi thứ!).


0

Tôi đã phải đối mặt với một tình huống tương tự, nhưng trong trường hợp của tôi, tôi không thể xóa một tập tin được tạo bởi chương trình của riêng tôi. Tôi chắc chắn về điều này bởi vì nó đã có mặt trong một thư mục được tạo bởi chương trình của tôi. Tôi không biết tôi đã chạy chương trình đó ở đâu và khi nào. Giải pháp: Tôi chỉ đơn giản là thoát khỏi tất cả các thiết bị đầu cuối của tôi. Tôi đăng nhập lại và chỉ cần xóa các tập tin.

PS Câu trả lời của tôi chỉ hợp lệ cho scenerio tôi đã chỉ định.

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.