it-swarm-ru.tech

Как узнать, какие процессы препятствуют размонтированию устройства?

Иногда я хотел бы отключить SB-устройство с помощью umount /run/media/theDrive, но я получаю drive is busy ошибка.

Как узнать, какие процессы или программы обращаются к устройству?

70
Stefan

Используйте lsof | grep /media/whatever чтобы узнать, что использует крепление.

Также рассмотрим umount -l (отложенная установка), чтобы новые процессы не могли использовать диск во время очистки.

70
Peter Eisentraut

В большинстве случаев лучше всего использовать команду lsof (" l i s t o ручка f Īles").

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, который перечисляет только PID процессов с открытыми файлами на устройстве:

fuser -m /media/usb0
37
Gilles 'SO- stop being evil'

Открытые файлы

Процессы с открытыми файлами являются обычными виновниками. Показать их:

_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)

Анонимные inode может быть создано:

  • Временные файлы (open с _O_TMPFILE_)
  • inotify часы
  • [Eventfd]
  • [Eventpoll]
  • [Timerfd]

Это самый неуловимый тип покемонов, и он отображается в столбце lsofTYPE как _a_inode_ (который недокументирован в человеке lsof) страница ).

Они не будут отображаться в _lsof +f -- /dev/<device>_, поэтому вам необходимо:

_lsof | grep a_inode
_

Для процессов уничтожения, содержащих анонимные inode, смотрите: Список текущих наблюдений inotify (путь, PID) .

inotify часы (Linux)

Этот комментарий объясняет, почему inotify не должен предотвращать размонтирование, но это примечание описывает ситуации, в которых он будет :

размонтирование может зависнуть в вызове vx_softcnt_flush(). Зависание происходит из-за того, что отслеживание inotify увеличивает значение переменной _i_count_ и заставляет _v_os_hold value_ оставаться повышенным до тех пор, пока наблюдатель inotify не освободит удержание.

9
Tom Hale

Вы можете использовать lsof, как сказал Питер, или если вы уверены, что просто хотите убить все эти вещи и размонтировать его, вы можете сделать что-то вроде:

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

Если вы используете GNOME, отключение через Nautilus отобразит сообщение о том, какой процесс все еще использует диск, и файл, который он использует.

alt text

5
tshepang

Для (как минимум) 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.

1
Kusalananda