Удаление бродячего файла я вижу .nfs0000000000b869e300000001

15

Я удалил файл и теперь вижу:

$ 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

и если я попытаюсь удалить это:

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

Что это означает? Что я должен делать

Майкл Даррант
источник
Эта проблема, в сочетании с этой индикатором звука-службой ошибкой где 100s процессов сохранения открытых файлов, в сочетании с isues , как они когда ~ / .cache / выскочка журналы растут очень большими и затем прессуют, были занимает много места в моем корпоративный диск NFS, который включает мой домашний каталог. Обошел его, добавив ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs killв crontab -e.
Андрес Риофрио

Ответы:

14

Файл может быть удален, пока он открыт процессом. Когда это происходит, запись каталога удаляется, но сам файл (индекс и содержимое) остается позади; файл действительно удаляется только тогда, когда у него больше нет ссылок, и он не открыт каким-либо процессом.

NFS - это протокол без сохранения состояния: операции могут выполняться независимо от предыдущих операций. Сервер даже может перезагрузиться, и как только он вернется в сеть, клиенты продолжат доступ к файлам, как и раньше. Чтобы это работало, файлы должны быть обозначены их именами, а не обработкой, полученной путем открытия файла (который сервер забудет при перезагрузке).

Соедините их вместе: что происходит, когда файл открывается клиентом и удаляется? Файл должен иметь имя, чтобы клиент, у которого он открыт, мог получить к нему доступ. Но когда файл удален, ожидается, что после этого файла с таким именем больше не будет. Таким образом, серверы NFS превращают удаление открытого файла в переименование: файл переименовывается в .nfs…( .nfsза которым следует строка букв и цифр).

Вы не можете удалить эти файлы (если вы попробуете, все, что происходит, это то, что появляется новое .nfs…с другим суффиксом). Они в конечном счете уйдут, когда клиент, у которого открыт файл, закроет его. (Если клиент исчезает перед закрытием файла, может пройти некоторое время, пока сервер не заметит.)

Жиль "ТАК - перестань быть злым"
источник
2

Пользователь @mtak по другому вопросу предлагает:

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

^^^^^ Это работает ^^^^^ И убейте нарушающий процесс, чтобы он освободил дескриптор файла.

например

$ 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

УРА! Успех.

YMMV конечно. Это может быть другой процесс с открытым файлом.

Процесс извлечения трекера был перезапущен автоматически после того, как я его убил.

Что это за трекер-экстракт? (Я вижу это на 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
gaoithe
источник
1
Гораздо полезнее, чем принятый ответ, так как он предоставляет пользователю способ исправить ситуацию.
ЧБ
1

Поскольку NFS «не имеет состояния», должен быть способ эмулировать UNIX-метод открытия файла, а затем удалять его, сохраняя открытый дескриптор файла.

Любая файловая операция NFS вызывает цепочку:

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

чтобы быть запущенным, и это является причиной того, что NFS переживает перезагрузку сервера.

Как только процесс на клиенте, открывшем старый файл, завершается, файл исчезает.

Правильно реализованные файловые серверы будут запускать сценарии каждую ночь, которые удаляют все такие файлы, которые старше недели. Причина в том, что в случае, если клиент перезагружается, удерживая такой файл, файл останется навсегда.

Шили
источник
0

Какой-то другой процесс, вероятно, все еще использует файл (то есть имеет открытый дескриптор файла). Либо проигнорируйте файл, либо используйте lsofили подобное, чтобы попытаться найти, какой процесс открыл этот файл (или перезагрузите все!).

thrig
источник
0

Я столкнулся с подобной ситуацией, но в моем случае я не могу удалить файл, созданный моей собственной программой. Я был уверен в этом, потому что он присутствовал в каталоге, созданном моей программой. Я не знал, где и когда я запустил эту программу. Решение: я просто вышел из всех своих терминалов. Я снова вошел в систему и просто удалил файл.

PS Мой ответ действителен только для указанного сценария.

Пурушоттам Парах
источник