Когда я делаю
sudo umount /media/KINGSTON
я получил
umount: /media/KINGSTON: device is busy.
Я закрываю все окна и проверяю, чтобы все оболочки указывали на другие каталоги. Как я могу найти, какой процесс предотвращает размонтирование?
откройте терминал:
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^@
Надеюсь, это поможет
Тем временем команда фьюзера значительно улучшилась. Вы можете выполнить всю работу с помощью одной команды:
$ sudo fuser -ickv /"mountpoint"
Где:
k
убивает нарушающий процесс, v
показывает заранее процесс и его Пользователь i
запрашивает подтверждение. Если какой-то процесс сопротивляется, попробуйте снова с помощью fuser -ickv -9
(или, в более общем смысле, с помощью -SIGNAL
), который убивает самых упорных.
Но вы всегда найдете какой-нибудь "бессмертный" процесс ...!
В этих случаях я недавно научился использовать
$ sudo umount --lazy --force <mountpoint>
как последний ресурс, который до сих пор работал у меня каждый раз.
Также это может помочь:
lsof | grep \/media\/KINGSTON
Наиболее полезным инструментом является 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
.
Есть GUI для lsof, glsof, но он еще не готов для прайм-тайма, и пока не упакован для Ubuntu.
¹ .
Lsof может перечислять некоторую информацию о процессах других пользователей, но он не определяет точку монтирования, поэтому не будет перечислять их, если вы укажете точку монтирования.
²
Исполняемый код часто называют текстом при обсуждении исполняемых форматов.