Как преодолеть «устройство или ресурс занят»?

229

Я попытался rm -rfоткрыть папку и получил «устройство или ресурс занят».

В Windows я бы использовал LockHunter, чтобы решить эту проблему. Что такое эквивалент Linux? (Пожалуйста, дайте в качестве ответа простой метод «разблокировать этот», а не полные статьи, подобные этой . Хотя они полезны, в настоящее время меня интересует только ASimpleMethodThatWorks ™)

ripper234
источник
5
Спасибо, это было удобно - я переходил с Linux на Windows, искал эквивалент lsof - LockHunter.
Соня Гамильтон
3
Что за черт? Unix не мешает вам удалять открытые файлы, как это делает Windows. Вот почему вы можете удалить всю систему, запустив rm -rf /... она с радостью удалит каждый файл, включая / bin / rm.
psusi 10.10.14
1
@psusi, это неправильно. У вас либо плохой источник информации, либо вы просто выдумываете. Linux, как и Windows, имеет блокировку файлов и устройств. Это немного сломано, хотя. 0pointer.de/blog/projects/locking.html
foobarbecue
1
@foobarbecue, обычно это только рекомендательные блокировки, и страница руководства, по крайней мере, указывает, что они предназначены только для чтения / записи, а не для удаления ссылок.
Псуси

Ответы:

232

Инструмент, который вы хотите lsof, это означает, что список открытых файлов .

У него много опций, поэтому проверьте страницу руководства, но если вы хотите увидеть все открытые файлы в каталоге:

lsof +D /path

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

Как только вы узнаете, в каких процессах открыты файлы, вы можете выйти из этих приложений или убить их с помощью kill(1)команды.

CAMH
источник
46
Что делать, если не было результатов?
морпехи
22
@marines: Проверьте, смонтирована ли другая файловая система ниже /path. Это одна из причин скрытых «открытых файлов».
camh
2
Команда lsof непосредственно к пути не работает. Таким образом, в основном нужно перейти в путь и запустить lsof busy_file, а затем завершить весь процесс
J4cK
4
lsofкажется, ничего не делает для меня: lsof storage/logs/laravel.logничего не вернул, и так сделал lsof +D storage/logs/. umountответил с not mounted.
Райан
1
Просто чтобы уточнить ответ @camh: используйте mount | grep <path>. Это показывает, что любой /dev/<abc>может быть установлен на <path>. Используйте, sudo umount -lf /dev/<abc>а затем попробуйте удалить <path>. Работает для меня. Спасибо @camh
Викас Гоэль
107

иногда это является результатом проблем с монтированием, поэтому я размонтирую файловую систему или каталог, который вы пытаетесь удалить:

размонтирование / путь

kip2
источник
5
Без четверти четыре. Спасибо человек, ты спас мне ночь. Веселое. На одной линии - так много потерянного времени -.- '
Aiyion.Prime
1
моей проблемой был каталог журналов, смонтированный как / dev / mapper / vg00-root
Spikolynn
1
Помог мне выбраться из аналогичного джема на моталках.
Джон
1
в моем случае Дженкинс не размонтировал chroot dir после прерывания задачи
zarkone
1
в моем случае размонтирование с рабочим столом Ubuntu сработало !! Спасибо
JRichardsz
14

Я использую fuserдля такого рода вещи. Он покажет, какой процесс использует файл или файлы в монтировании.

BillThor
источник
fuserпомогает только в конкретном случае, когда вы хотите размонтировать файловую систему. Здесь проблема состоит в том, чтобы найти то, что использует определенный файл.
Жиль
@ Жиль: также работает для файлов.
BillThor
Извините, неправильное возражение: fuserздесь не помогает, потому что проблема в том, чтобы найти все открытые файлы в дереве каталогов. Вы можете сказать, lsofчтобы показать все файлы и фильтр, или сделать его рекурсивным; fuserне имеет такого режима и должен вызываться для каждого файла.
Жиль
@Giles: fuserработает будет списки. Попробуйте fuser /var/log/*, если какие-либо журналы открыты, он скажет, какие и у кого есть открытые. Если простой шаблон, не будет работать, findс или без xargsбудет делать эту работу.
BillThor
1
lsofне было в моем пути, пока fuserбыл, позволяя мне найти идентификатор процесса, который нарушает работу, чтобы убить, так что + 1 + спасибо.
стевеслива
12

Вот решение:

  1. Зайдите в каталог и введите ls -a
  2. Вы найдете .xyzфайл
  3. vi .xyz и посмотреть, что содержимое файла
  4. ps -ef | grep username
  5. Вы увидите содержимое .xyz в 8-м столбце (последняя строка).
  6. kill -9 job_ids - где job_ids - значение 2-го столбца соответствующей ошибки, вызванной содержимым в 8-м столбце
  7. Теперь попробуйте удалить папку или файл.
user73011
источник
4
Было бы интересно узнать, откуда берутся эти загадочные файлы.
Джон У. С. Смит,
9

У меня была такая же проблема, построил однострочник, начиная с рекомендации @camh:

lsof +D ./ | awk '{print $2}' | tail -n +2 | xargs kill -9

Команда awkзахватывает PIDS. Команда tailизбавляется от надоедливой первой записи: «PID». Я использовал -9на kill, другие могли бы иметь более безопасные варианты.

Чойлтон Б. Хиггинботтом
источник
1
Чтобы сделать его более универсальным, вы можете использовать ./ для текущего каталога вместо журнала /
user2589273
Хороший вопрос, @ user2589273. Обновлено.
Чойлтон Б. Хиггинботтом
5

У меня была эта проблема, когда автоматизированный тест создал виртуальный диск. Команды предложили в других ответах, lsofи fuser, не помогал. После тестов я попытался размонтировать его, а затем удалить папку. Я был действительно смущен целую вечность, потому что я не мог избавиться от этого - я продолжал получать "Устройство или ресурс занят" !

Случайно я узнал, как избавиться от виртуального диска. Мне пришлось размонтировать его столько раз, сколько я выполнил mountкоманду, т.е. sudo umount path

Из-за того, что он был создан с использованием автоматического тестирования, он монтировался много раз, поэтому я не мог избавиться от него, просто размонтировав его один раз после тестов. Итак, после того, как я вручную размонтировал его много раз, он, наконец, снова стал обычной папкой, и я смог удалить его.

Надеюсь, это может помочь кому-то, кто сталкивается с этой проблемой!

gloriphobia
источник
5

Я часто сталкиваюсь с этим на серверах с сетевыми файловыми системами NFS. Я предполагаю, что это как-то связано с файловой системой, поскольку файлы обычно называются как .nfs000000123089abcxyz.

Мое типичное решение - переименовать или переместить родительский каталог файла, а затем вернуться позже через день или два, и файл будет удален автоматически, и в этот момент я могу свободно удалить каталог.

Обычно это происходит в каталогах, где я устанавливаю или компилирую программные библиотеки.

user5359531
источник
4

Отбросив вопрос Прабхата выше, у меня была эта проблема в macos high sierra, когда я застрял в процессе encfs, перезагрузка решила его, но это

ps -ef | grep name-of-busy-dir

Показал мне процесс и PID (столбец два).

sudo kill -15 pid-here

починил это.

миллиарду
источник
Это сработало и для меня. Что за -15?
O.rka
3

Если у вас есть доступ к серверу, попробуйте

Удаление этого каталога с сервера

Или, сделайте umount и снова смонтируйте , попробуйте umount -l: lazy umount, если вы столкнулись с какой-либо проблемой обычного umount.

У меня тоже была такая проблема где

lsof +D path : не дает вывода

ps -ef : не дает соответствующей информации

Прабхат Кумар Сингх
источник