Як перебороти "пристрій чи ресурс зайнятий"?


229

Я спробував rm -rfстворити папку, і "пристрій чи ресурс зайнятий".

У Windows я б використав LockHunter для вирішення цього питання. Що таке еквівалент Linux? (Будь ласка, дайте як відповідь простий метод "розблокувати цей", а не повні статті, як цей . Хоча вони корисні, в даний час мене цікавить саме ASimpleMethodThatWorks ™)


5
Спасибі це було зручно - я приїжджав із Linux до Windows, шукав еквівалент lsof - LockHunter.
Соня Гамільтон

3
Якого біса? Unix не заважає вам видаляти відкриті файли, як це робить Windows. Ось чому ви можете видалити всю вашу систему, запустивши rm -rf /... вона з радістю видалить кожен окремий файл, включаючи / bin / rm.
psusi

1
@psusi, це неправильно. У вас або погано джерело інформації, або просто вигадуєте речі. Linux, як і Windows, має блокування файлів і пристроїв. Це все-таки зламане. 0pointer.de/blog/projects/locking.html
foobarbecue

1
@foobarbecue, як правило, це лише дорадчі блокування, а сторінка людини, принаймні, вказує, що вони призначені лише для читання / запису, а не для від’єднання.
psusi

Відповіді:


232

Вам потрібний інструмент lsof, який означає список відкритих файлів .

У ньому багато варіантів, тому перевірте головну сторінку, але якщо ви хочете побачити всі відкриті файли під каталогом:

lsof +D /path

Це повториться через файлову систему в розділі /path, тому остерігайтеся робити це на великих деревах каталогів.

Коли ви дізнаєтеся, у яких процесах відкриті файли, ви можете вийти з цих програм або вбити їх kill(1)командою.


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
Vikas Goel

107

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

umount / шлях


5
Це чверть-чотири. Спасибі, ви врятували мою ніч. Веселий. На одному рядку - стільки витрачено витрачений час -.- '
Aiyion.Prime

1
моєю проблемою був каталог журналів, встановлений як / dev / mapper / vg00-root
Spikolynn

1
Допомогли мені вибратися з подібного варення на мотузках.
Jon

1
у моєму випадку Дженкінс не знімав chroot dir після відміни завдання
zarkone

1
у моєму випадку відключити робочий стіл ubuntu !! ЗАВДЯКИ
JRichardsz

14

Я використовую fuserдля такого роду речі. Він перерахує, який процес використовує файл або файли в межах кріплення.


fuserдопомагає лише в конкретному випадку, коли потрібно відключити файлову систему. Тут проблема полягає у пошуку того, що використовується для певного файлу.
Жиль

@Gilles: також працює для файлів.
BillThor

Вибачте, неправильне заперечення: fuserтут не допомагає, оскільки проблема полягає у пошуку всіх відкритих файлів у дереві каталогів. Ви можете сказати lsofпоказати всі файли та фільтрувати, або зробити їх повторними; fuserне має такого режиму і його потрібно викликати у кожному файлі.
Жиль

@Giles: fuserтвори будуть списки. Спробуйте fuser /var/log/*, якщо якісь журнали відкриті, він підкаже, які з них і у кого відкриті. Якщо простий підстановочний код, не вийде, findз або без xargsбуде виконувати цю роботу.
BillThor

1
lsofпоки не був на моєму шляху fuser, що дозволило мені знайти обраний ідентифікатор процесу для вбивства, тому +1 + спасибі
stevesliva

12

Ось рішення:

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

4
Було б цікаво дізнатися, звідки беруться ці загадкові файли.
Джон У. Сміт

9

У мене був цей самий випуск, я створив однокласину, починаючи з рекомендації @camh:

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

awkКоманда захоплює PIDS. tailКоманда позбавляється від докучливих першого запису: «PID». Я використовував -9у вбивстві, інші можуть мати безпечніші варіанти.


1
Щоб зробити його універсальнішим, ви можете використовувати ./ для поточного каталогу замість журналу /
user2589273

Хороший момент, @ user2589273. Оновлено.
Choylton B. Higginbottom

5

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

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

Через те, що він був створений за допомогою автоматизованого тестування, він встановлювався багато разів, тому я не міг його позбутися, просто відключивши його один раз після тестів. Отже, після того, як я вручну відключив її багато разів, нарешті знову став звичайною папкою, і я міг її видалити.

Сподіваємось, це може допомогти комусь іншому, хто стикається з цією проблемою!


5

Я часто відчуваю це на серверах, що мають мережеві файлові системи NFS. Я припускаю, що це має щось спільне з файловою системою, оскільки файли, як правило, називаються як .nfs000000123089abcxyz.

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

Зазвичай це відбувається в каталогах, де я встановлюю або складаю бібліотеки програмного забезпечення.


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 : не надає відповідної інформації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.