Коли я це роблю
sudo umount /media/KINGSTON
я зрозумів, я отримав
umount: /media/KINGSTON: device is busy.
Я закриваю всі вікна і переконуюсь, що вся оболонка вказує на інші каталоги. Як я можу знайти, який процес перешкоджає численності?
Коли я це роблю
sudo umount /media/KINGSTON
я зрозумів, я отримав
umount: /media/KINGSTON: device is busy.
Я закриваю всі вікна і переконуюсь, що вся оболонка вказує на інші каталоги. Як я можу знайти, який процес перешкоджає численності?
Відповіді:
відкрити термінал:
fuser -c /media/KINGSTON
Він виведе щось подібне:
/media/KINGSTON/: 3106c 11086
Це дасть вам приємність процесів, що використовують цей обсяг. Додатковий символ в кінці pid дасть додаткову інформацію. (c 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^@
Сподіваюсь, це допоможе
ps <pid>
замість редагування файлів у / proc, щоб побачити ім'я команди та аргументи.
Найкориснішим інструментом є 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 може перелічити деяку інформацію про процеси інших користувачів, але він не визначає точку монтування, тому не буде перелічувати їх, якщо вказати точку монтування.
²
Виконавчим кодом часто називають текст під час обговорення виконавчих форматів.
Також це може допомогти:
lsof | grep \/media\/KINGSTON
grep "media/KINGSTON"
Тим часом команда плавника значно покращилася. Ви можете виконати повну роботу за допомогою однієї команди:
$ sudo fuser -ickv /"mountpoint"
Де:
k
вбиває процес порушника,v
заздалегідь показує процес та його користувачаi
просить у вас підтвердження. Якщо якийсь процес чинить опір, то спробуйте ще раз fuser -ickv -9
(або в більш загальному випадку з -SIGNAL
), що вбиває найбільш впертих.
Але ви завжди знайдете якийсь "безсмертний" процес ...!
У цьому випадку я останнім часом навчився користуватися
$ sudo umount --lazy --force <mountpoint>
як останній ресурс, який до цього часу працював для мене кожен раз.
vboxmanage
. -_-