Іноді я хотів би демонтувати 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 ).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розділу.
Для (принаймні) 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показує оболонку, який поточний каталог використовує цей пристрій. Можливо, ви знову захочете подати заявку на те, щоб змінити каталог.