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

Когда я делаю

sudo umount /media/KINGSTON

я получил

umount: /media/KINGSTON: device is busy.

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

31
задан 6 November 2010 в 22:05

4 ответа

откройте терминал:

fuser -c /media/KINGSTON

Он выдаст что-то вроде:

/media/KINGSTON/: 3106c 11086

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

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

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

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

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

cat /proc/<pid>/cmdline

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

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

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

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

33
ответ дан 6 November 2010 в 22:05

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

$ sudo fuser -ickv /"mountpoint"

Где:

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

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

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

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

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

2
ответ дан 6 November 2010 в 22:05

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

lsof | grep \/media\/KINGSTON
2
ответ дан 6 November 2010 в 22:05

Наиболее полезным инструментом является lsof Install 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: файл, отображенный на память (здесь думайте об этом как об открытом файле)
  • a число: реально открытый файл; последующая буква указывает на режим открытия, например, r для чтения и w для записи

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

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

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

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

8
ответ дан 6 November 2010 в 22:05

Другие вопросы по тегам:

Похожие вопросы: