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

26

Когда я делаю

sudo umount /media/KINGSTON

я получил

umount: /media/KINGSTON: device is busy.

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

Гийом Котэ
источник
3
Я думаю, что у вас есть опечатка здесь, я сомневаюсь, что команда вернула "Как мне узнать, какой процесс потребляет мою пропускную способность?" ...;) Если бы вы могли отредактировать вопрос, пожалуйста?
8128

Ответы:

24

открыть терминал:

fuser -c /media/KINGSTON

Это выведет что-то вроде этого:

/media/KINGSTON/: 3106c 11086

Это даст вам pid процессов, использующих этот том. Дополнительный символ в конце pid даст дополнительную информацию. (c в 3106c)

c - процесс использует файл в качестве текущего рабочего каталога
m - файл отображается с помощью mmap
o - процесс использует его в качестве открытого файла
r - файл является корневым каталогом процесса
t - процесс обращается к файл как текстовый файл
у - этот файл является управляющим терминалом для процесса

Так что для размонтирования просто убейте эти пиды и попробуйте снова размонтировать

sudo kill -9 3106 11086
sudo umount /media/KINGSTON

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

cat /proc/<pid>/cmdline

Например : cat /proc/11086/cmdline

это выведет что-то вроде ниже.

    evince^@/media/KINGSTON/Ubuntu-guide.pdf^@

Надеюсь, это поможет

aneeshep
источник
2
fuser -ck также убил бы его.
Жоау Пинту
3
Я бы предложил сначала убить их без опции -9, чтобы дать этим приложениям возможность полностью завершить работу. И я бы предложил использовать ps <pid>вместо редактирования файлов в / proc, чтобы увидеть имя команды и аргументы.
Мариус Гедминас
Я следую вашей процедуре, чтобы найти процесс, это Тунар - Деймон. Там нет дополнительного персонажа, дающего дополнительную информацию. Я еще не убил его, я беспокоюсь о том, как это может повлиять на работу другого.
Гийом Котэ
7

Самый полезный инструмент - это lsof Установить lsof . Он показывает, какие файлы используются какими процессами. Если /media/KINGSTONэто точка монтирования (имя устройства также будет работать), следующая команда показывает все файлы, которые используются в этой точке монтирования:

lsof /media/KINGSTON

Если вы запустите эту команду как обычный пользователь, она покажет только ваши собственные процессы¹. Запустите, sudo lsof /media/KINGSTONчтобы увидеть все процессы пользователей.

Вывод из lsofвыглядит так:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
zsh4    31421 gilles  cwd    DIR    8,1     4096 130498 /var/tmp
zsh4    31421 gilles  txt    REG    8,1   550804 821292 /bin/zsh4
zsh4    31421 gilles  mem    REG    8,1    55176 821326 /usr/lib/zsh/4.3.10/zsh/complist.so
zsh4    31421 gilles   12r   REG    8,1   175224 822276 /usr/share/zsh/functions/Completion.zwc

В COMMANDстолбце отображается имя исполняемого файла программы, а в PIDстолбце - идентификатор процесса. NAMEКолонка показывает имя файла; Вы можете увидеть, был (deleted)ли файл удален во время открытия (когда файл удаляется, у него больше нет имени, но он все еще существует, пока последний процесс, использующий его, не закроет файл). USERдолжно быть само за себя. Другие столбцы здесь не имеют значения, за исключением, возможно, того FD, что показывает, как файл используется процессом:

  • cwd: текущий рабочий каталог
  • txt: исполняемый файл²
  • mem: отображенный в память файл (здесь, думайте об этом как об открытом файле)
  • число: фактический открытый файл; последующее письмо указывает на режим открытия, например, rдля чтения и wдля записи

Не существует никакого механического способа найти окно, в котором открыт файл (на самом деле это не технически значимо: если процесс имеет несколько окон, файл не имеет особой связи с тем или иным окном), ни даже какой-либо простой способ идентификации окно процесса (и, конечно, процесс не должен иметь никаких окон). Но обычно имени команды и имени файла достаточно, чтобы найти нарушителя и правильно закрыть файл.

Если вы не можете закрыть файл и просто хотите закончить все это, вы можете завершить процесс kill 31421(где 31421находится идентификатор процесса) или kill -HUP 31421(«повесить трубку»). Если обычное убийство не делает трюк, убить с крайним предубеждением: kill -KILL 31421.

Есть графический интерфейс для lsof, glsof , но он еще не совсем готов к прайм- тайму и пока не упакован для Ubuntu.

¹ Lsof может перечислить некоторую информацию о процессах других пользователей, но он не обнаруживает точку монтирования поэтому не буду их перечислять , если указать точку монтирования.
² Исполняемый код часто называют текстом в обсуждениях исполняемых форматов.

Жиль "ТАК - перестань быть злым"
источник
2

Также это может помочь:

lsof | grep \/media\/KINGSTON
Ашем Масуд
источник
4
Там нет необходимости избегать косой черты.
Мариус Гедминас
Когда вы не уверены, Grep с кавычки , напримерgrep "media/KINGSTON"
Adam Matan
2

Между тем, команда fuser значительно улучшилась. Вы можете сделать всю работу с помощью одной команды:

$ sudo fuser -ickv /"mountpoint"

Где:

  • параметр kубивает оскорбительный процесс,
  • пока vзаранее показывает процесс и его пользователя
  • и iпросит вас подтвердить.

Если какой-то процесс сопротивляется, попробуйте еще раз с fuser -ickv -9(или, в более общем смысле, с -SIGNAL), который убивает самых упрямых.
Но вы всегда найдете какой-нибудь «бессмертный» процесс ...!

В этих случаях я недавно научился использовать

$ sudo umount --lazy --force <mountpoint>

последний ресурс, который до сих пор работал на меня каждый раз.

prometheos
источник
Я нашел бессмертный процесс, мою неудачную попытку использовать vboxmanage. -_-
Судо