Як дізнатися, які процеси перешкоджають демонтажу пристрою?


58

Іноді я хотів би демонтувати USB пристрій з umount /run/media/theDrive, але я отримую повідомлення про drive is busyпомилку.

Як дізнатися, які процеси чи програми отримують доступ до пристрою?


1
більше пропозицій на те саме питання / відповідь тут: stackoverflow.com/questions/624154/…
Тревор Бойд Сміт

Відповіді:


57

Використовуйте, lsof | grep /media/whateverщоб дізнатися, що використовує кріплення.

Крім того, врахуйте umount -l(лінивий вміст), щоб запобігти використанню диска нових процесів під час очищення.


24
fuser -mv /path/to/mountpointможе бути більш читаною альтернативою для пошуку процесів за допомогою точки моменту.
Ріккардо Муррі

@RiccardoMurri lsof | grepкраще працює для мене. fuser -mvздається, просто скидає 80+ незв’язаних процесів. Я використовую каталоги, пов’язані з монтажем.
Ricky Boyce

1
umount -lнебезпечно . натомість порожній каталог mount -o bind режиму 000та очищення через lsof +f -- /dev/device.
Том Хейл

35

Здебільшого найкраща команда для використання - lsof (" l i s t o pen f iles").

lsof +f -- /media/usb0

де /media/usb0знаходиться точка монтажу USB-накопичувача чи іншої файлової системи, яку потрібно відключити. +f --повідомляє lsof трактувати наступний аргумент як точку монтажу; Зазвичай це, але не завжди, вдається самостійно, так що це lsof /media/usb0також працює. Тут знаходять відкриті файли (навіть непоєднані), файли, відображені в пам'яті, поточні каталоги та деякі інші незрозумілі використання. Вам потрібно буде запустити команду як root, щоб отримати інформацію про процеси інших користувачів (і, думаю, є унісеси, де lsofпотрібно запускати як root).

Є використання, які lsof не знайде; вони є рідкістю на знімних носіях. Вони включають:

  • точки кріплення: ви не можете відключити, /fooякщо /foo/barце точка кріплення.
  • пристрої монтування: ви не можете відключити, /fooякщо /foo/barце змонтований блок-пристрій чи звичайний файл, встановлений у циклі, або якщо він є джерелом кріплення прив’язки для Linux.
  • Експорт NFS: lsof не виявить, що дерево експортується сервером NFS ядра.

Ще одна команда, яка може служити в крайньому випадку, - це термофіксатор, який містить лише ПІД-процеси процесів із відкритими файлами на пристрої:

fuser -m /media/usb0

8

Ви можете використовувати так, lsofяк сказав Петро, ​​або якщо ви впевнені, що просто хочете вбити всі ці речі та відключити їх, ви, ймовірно, можете зробити щось на кшталт:

fuser -Mk /mnt/path
umount /mnt/path

1
Якщо ви збираєтесь це робити, погляньте на використання -Mдля безпеки.
Том Хейл

@TomHale Ви можете уточнити, до якої команди -Mслід застосувати.
HSchmale

1
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Том Хейл

6

Відкрити файли

Процеси з відкритими файлами - звичні винуватці. Показати їх:

lsof +f -- <mountpoint or device>

Є перевага використання, /dev/<device>а не /mountpoint: точка umount -lмонтажу зникне після , або вона може бути прихована накладеним кріпленням.

fuserтакож можна використовувати, але на мій погляд lsof, є більш корисний вихід. Однак fuserкорисно, коли мова йде про вбивство процесів, що викликають ваші драми, щоб ви могли продовжувати своє життя.

Список файлів на <mountpoint>(див. Попередження вище):

fuser -vmM <mountpoint>

Інтерактивно вбивайте лише процеси з відкритими для запису файлами:

fuser -vmMkiw <mountpoint>

Після повторного перенаправлення лише для читання ( mount -o remount,ro <mountpoint>) безпечно (r) знищити всі процеси, що залишилися:

fuser -vmMk <mountpoint>

Точки горі

Винуватцем може бути саме ядро. Інша файлова система, встановлена ​​на файловій системі, яку ви намагаєтеся umountвикликати горе. Перевірте:

mount | grep <mountpoint>/

Щодо петльових кріплень ( спасибі Стівен Кітт ), також перевірте вихід:

losetup -la

Анонімні введення (Linux)

Анонімні вводи можна створити:

  • Тимчасові файли ( openз O_TMPFILE)
  • прищеплювати годинник
  • [eventfd]
  • [опитування подій]
  • [timerfd]

Це найбільш невловимий тип покемону, і вони з'являються у стовпці lsof's (що недокументовано на сторінці man ).TYPEa_inodelsof

Вони не відображатимуться lsof +f -- /dev/<device>, тому вам потрібно:

lsof | grep a_inode

Про вбивство процесів, що містять анонімні іноди, див.: Список списку поточних інотифікованих годин (ім'я шляху, PID) .

inotify годинник (Linux)

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

відключення може зависнути під час vx_softcnt_flush()дзвінка. Зависання відбувається через те, що інотифікований годинник збільшує i_countзмінну і призводить v_os_hold valueдо того, що вона залишається підвищеною, доки інотифікований спостерігач не звільнить затримку.


Є ще одне кріплення для зворотного циклу: якщо ви змонтуєте файлову систему, а потім змонтуйте файл у цій файловій системі за допомогою монтажу на зворотному звороті, ви не зможете відключити першу файлову систему, але нічого не відображатиметься lsof.
Стівен Кітт

Ура. Додано до Mountpointsрозділу.
Том Хейл

5

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

alt текст


1

Для (принаймні) OpenBSD:

$ fstat /mnt/mountpoint

Наприклад (використовуючи doasдля виконання fstatяк root, оскільки ми в іншому випадку бачили б лише власні процеси):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

У цьому випадку я не зможу відключити, /usr/portsпоки користувач _pbuildне завершить виконання цих двох makeпроцесів.


-2

Це звичайна помилка: ви ставитеся до іншого користувача (або root, або будь-якого іншого користувача), переходите в каталог встановленого пристрою, а потім виходите з цього користувача. Коли ви забудете, що ви залишили в цьому каталозі, можете спробувати знайти, поки не осліпнете. lsofпоказує оболонку, який поточний каталог використовує цей пристрій. Можливо, ви знову захочете подати заявку на те, щоб змінити каталог.


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