Я удалил файл и теперь вижу:
$ 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
Что это означает? Что я должен делать
ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill
вcrontab -e
.Ответы:
Файл может быть удален, пока он открыт процессом. Когда это происходит, запись каталога удаляется, но сам файл (индекс и содержимое) остается позади; файл действительно удаляется только тогда, когда у него больше нет ссылок, и он не открыт каким-либо процессом.
NFS - это протокол без сохранения состояния: операции могут выполняться независимо от предыдущих операций. Сервер даже может перезагрузиться, и как только он вернется в сеть, клиенты продолжат доступ к файлам, как и раньше. Чтобы это работало, файлы должны быть обозначены их именами, а не обработкой, полученной путем открытия файла (который сервер забудет при перезагрузке).
Соедините их вместе: что происходит, когда файл открывается клиентом и удаляется? Файл должен иметь имя, чтобы клиент, у которого он открыт, мог получить к нему доступ. Но когда файл удален, ожидается, что после этого файла с таким именем больше не будет. Таким образом, серверы NFS превращают удаление открытого файла в переименование: файл переименовывается в
.nfs…
(.nfs
за которым следует строка букв и цифр).Вы не можете удалить эти файлы (если вы попробуете, все, что происходит, это то, что появляется новое
.nfs…
с другим суффиксом). Они в конечном счете уйдут, когда клиент, у которого открыт файл, закроет его. (Если клиент исчезает перед закрытием файла, может пройти некоторое время, пока сервер не заметит.)источник
Пользователь @mtak по другому вопросу предлагает:
You could try running
fuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13
^^^^^ Это работает ^^^^^ И убейте нарушающий процесс, чтобы он освободил дескриптор файла.
например
УРА! Успех.
YMMV конечно. Это может быть другой процесс с открытым файлом.
Процесс извлечения трекера был перезапущен автоматически после того, как я его убил.
Что это за трекер-экстракт? (Я вижу это на centos / redhat)
/programming/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram
источник
Поскольку NFS «не имеет состояния», должен быть способ эмулировать UNIX-метод открытия файла, а затем удалять его, сохраняя открытый дескриптор файла.
Любая файловая операция NFS вызывает цепочку:
open(); seek-last-off(); doit(); close();
чтобы быть запущенным, и это является причиной того, что NFS переживает перезагрузку сервера.
Как только процесс на клиенте, открывшем старый файл, завершается, файл исчезает.
Правильно реализованные файловые серверы будут запускать сценарии каждую ночь, которые удаляют все такие файлы, которые старше недели. Причина в том, что в случае, если клиент перезагружается, удерживая такой файл, файл останется навсегда.
источник
Какой-то другой процесс, вероятно, все еще использует файл (то есть имеет открытый дескриптор файла). Либо проигнорируйте файл, либо используйте
lsof
или подобное, чтобы попытаться найти, какой процесс открыл этот файл (или перезагрузите все!).источник
Я столкнулся с подобной ситуацией, но в моем случае я не могу удалить файл, созданный моей собственной программой. Я был уверен в этом, потому что он присутствовал в каталоге, созданном моей программой. Я не знал, где и когда я запустил эту программу. Решение: я просто вышел из всех своих терминалов. Я снова вошел в систему и просто удалил файл.
PS Мой ответ действителен только для указанного сценария.
источник