Jak dowiedzieć się, który proces uniemożliwia umount?

26

Kiedy robię

sudo umount /media/KINGSTON

mam

umount: /media/KINGSTON: device is busy.

Zamykam wszystkie okna i upewniam się, że wszystkie powłoki wskazują inne katalogi. Jak mogę dowiedzieć się, który proces uniemożliwia umount?

Guillaume Coté
źródło
3
Myślę, że masz tu literówkę. Wątpię, czy polecenie to zwróciło: „Jak mogę dowiedzieć się, który proces pochłania moją przepustowość?” ...;) Czy jest jakaś szansa na edytowanie pytania?
8128,

Odpowiedzi:

24

otwórz terminal:

fuser -c /media/KINGSTON

Wyprowadzi coś takiego:

/media/KINGSTON/: 3106c 11086

To da ci pid procesów korzystających z tego woluminu. Dodatkowa postać na końcu pid poda dodatkowe informacje. (cw 3106c)

c - proces używa pliku jako bieżącego katalogu roboczego
m - plik jest mapowany za pomocą mmap
o - proces używa go jako otwartego pliku
r - plik jest katalogiem głównym procesu
t - proces uzyskuje dostęp do plik jako plik tekstowy
y - ten plik jest terminalem sterującym dla procesu

Więc aby odmontować, po prostu zabij te pidy i ponownie spróbuj odmontować

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

Uwaga: Aby znaleźć dokładną nazwę tych pidów, możesz użyć tego polecenia

cat /proc/<pid>/cmdline

Na przykład : cat /proc/11086/cmdline

spowoduje to wyświetlenie czegoś takiego jak poniżej.

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

Mam nadzieję, że to pomoże

aneeshep
źródło
2
fuser -ck też by go zabił.
João Pinto,
3
Sugerowałbym zabicie ich bez opcji -9, aby dać tym aplikacjom szansę na czyste zamknięcie. I sugerowałbym użycie ps <pid>zamiast edycji plików w / proc, aby zobaczyć nazwę polecenia i argumenty.
Marius Gedminas
Postępuję zgodnie z twoją procedurą, aby znaleźć proces, to Thunar - deamon. Nie ma dodatkowej postaci podającej dodatkowe informacje. Jeszcze go nie zabiłem, martwię się o wpływ, jaki może to mieć na inne rzeczy.
Guillaume Coté
7

Najbardziej użytecznym narzędziem jest lsof Zainstaluj lsof . Pokazuje, z jakich plików korzystają poszczególne procesy. Jeśli /media/KINGSTONjest punktem podłączenia (nazwa urządzenia również by działała), następujące polecenie pokazuje wszystkie pliki, które są używane w tym punkcie podłączenia:

lsof /media/KINGSTON

Jeśli uruchomisz to polecenie jako zwykły użytkownik, wyświetli on tylko twoje procesy¹. Uruchom, sudo lsof /media/KINGSTONaby zobaczyć procesy wszystkich użytkowników.

Dane wyjściowe lsofwygląda następująco:

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

Do COMMANDprzedstawienia kolumna nazwa pliku wykonywalnego programu i PIDprzedstawia kolumna ID procesu. NAMEKolumna pokazuje nazwę pliku; możesz zobaczyć, (deleted)czy plik został usunięty podczas otwierania (gdy plik jest usuwany, nie ma już nazwy, ale nadal istnieje, dopóki plik nie zostanie zamknięty przez ostatni proces). USERpowinno być zrozumiałe. Pozostałe kolumny nie mają tutaj znaczenia, chyba żeFD , co pokazuje, w jaki sposób plik jest wykorzystywany przez proces:

  • cwd: bieżący katalog roboczy
  • txt: program wykonywalny²
  • mem: plik odwzorowany w pamięci (tutaj, myśl o nim jako o otwartym pliku)
  • liczba: rzeczywisty otwarty plik; kolejna litera wskazuje tryb otwierania, na przykład rdo czytania i wpisania

Nie ma mechanicznego sposobu zlokalizowania okna, w którym plik jest otwarty (w rzeczywistości nie ma to znaczenia technicznego: jeśli proces ma kilka okien, plik nie jest szczególnie powiązany z jednym lub innym oknem), ani nawet prosty sposób identyfikacji okno procesu (i oczywiście proces nie musi mieć żadnych okien). Ale zwykle nazwa polecenia i nazwa pliku wystarczają do zlokalizowania sprawcy i prawidłowego zamknięcia pliku.

Jeśli nie możesz zamknąć pliku i po prostu chcesz go zakończyć, możesz zabić proces za pomocą kill 31421(gdzie 31421jest identyfikator procesu) lub kill -HUP 31421(„rozłącz się”). Jeśli zwykły zabijanie nie załatwi, zabić skrajnej uszczerbku dla: kill -KILL 31421.

Istnieje interfejs GUI dla lsof , glsof , ale nie jest jeszcze gotowy na najwyższy czas i do tej pory nie jest dostępny dla Ubuntu.

¹ Lsof może wymienić niektóre informacje o procesach innych użytkowników, ale nie wykrywa punktu podłączenia, więc nie wyświetli ich, jeśli określisz punkt podłączenia.
² Kod wykonywalny jest często nazywany tekstem w dyskusjach na temat formatów wykonywalnych.

Gilles „SO- przestań być zły”
źródło
2

Może to również pomóc:

lsof | grep \/media\/KINGSTON
Hashem Masoud
źródło
4
Nie ma potrzeby uciekać przed ukośnikami.
Marius Gedminas
Jeśli nie jesteś pewien, grep z cytatami, np.grep "media/KINGSTON"
Adam Matan
2

Tymczasem polecenie utrwalacza znacznie się poprawiło. Możesz wykonać całą robotę za pomocą jednego polecenia:

$ sudo fuser -ickv /"mountpoint"

Gdzie:

  • parametr kzabija przestępstwo,
  • podczas gdy vz góry pokazuje proces i jego użytkownika
  • i iprosi o potwierdzenie.

Jeśli jakiś proces jest odporny, spróbuj ponownie z fuser -ickv -9(lub bardziej ogólnie z -SIGNAL), który zabija najbardziej uparte.
Ale zawsze znajdziesz jakiś „nieśmiertelny” proces ...!

W tych przypadkach ostatnio nauczyłem się używać

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

jako ostatni zasób, który do tej pory działał dla mnie za każdym razem.

prometheos
źródło
Znalazłem nieśmiertelny proces, moją nieudaną próbę użycia vboxmanage. -_-
sudo