Іноді я хотів би демонтувати USB пристрій з umount /run/media/theDrive
, але я отримую повідомлення про drive is busy
помилку.
Як дізнатися, які процеси чи програми отримують доступ до пристрою?
Іноді я хотів би демонтувати USB пристрій з umount /run/media/theDrive
, але я отримую повідомлення про drive is busy
помилку.
Як дізнатися, які процеси чи програми отримують доступ до пристрою?
Відповіді:
Використовуйте, lsof | grep /media/whatever
щоб дізнатися, що використовує кріплення.
Крім того, врахуйте umount -l
(лінивий вміст), щоб запобігти використанню диска нових процесів під час очищення.
fuser -mv /path/to/mountpoint
може бути більш читаною альтернативою для пошуку процесів за допомогою точки моменту.
lsof | grep
краще працює для мене. fuser -mv
здається, просто скидає 80+ незв’язаних процесів. Я використовую каталоги, пов’язані з монтажем.
umount -l
небезпечно . натомість порожній каталог mount -o bind
режиму 000
та очищення через lsof +f -- /dev/device
.
Здебільшого найкраща команда для використання - 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.Ще одна команда, яка може служити в крайньому випадку, - це термофіксатор, який містить лише ПІД-процеси процесів із відкритими файлами на пристрої:
fuser -m /media/usb0
Ви можете використовувати так, lsof
як сказав Петро, або якщо ви впевнені, що просто хочете вбити всі ці речі та відключити їх, ви, ймовірно, можете зробити щось на кшталт:
fuser -Mk /mnt/path
umount /mnt/path
-M
для безпеки.
-M
слід застосувати.
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.
Процеси з відкритими файлами - звичні винуватці. Показати їх:
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
Анонімні вводи можна створити:
open
з O_TMPFILE
)Це найбільш невловимий тип покемону, і вони з'являються у стовпці lsof
's (що недокументовано на сторінці man ).TYPE
a_inode
lsof
Вони не відображатимуться lsof +f -- /dev/<device>
, тому вам потрібно:
lsof | grep a_inode
Про вбивство процесів, що містять анонімні іноди, див.: Список списку поточних інотифікованих годин (ім'я шляху, PID) .
inotify
годинник (Linux)Цей коментар пояснює, чому inotify
не слід запобігати відключенню, але ця примітка описує ситуації, в яких вона буде :
відключення може зависнути під час
vx_softcnt_flush()
дзвінка. Зависання відбувається через те, що інотифікований годинник збільшуєi_count
змінну і призводитьv_os_hold value
до того, що вона залишається підвищеною, доки інотифікований спостерігач не звільнить затримку.
lsof
.
Mountpoints
розділу.
Для (принаймні) 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
процесів.
Це звичайна помилка: ви ставитеся до іншого користувача (або root, або будь-якого іншого користувача), переходите в каталог встановленого пристрою, а потім виходите з цього користувача. Коли ви забудете, що ви залишили в цьому каталозі, можете спробувати знайти, поки не осліпнете. lsof
показує оболонку, який поточний каталог використовує цей пристрій. Можливо, ви знову захочете подати заявку на те, щоб змінити каталог.