Come faccio a sapere quale processo sta impedendo un umount?

22

Quando faccio

sudo umount /media/KINGSTON

Ho ottenuto

umount: /media/KINGSTON: device is busy.

Chiudo tutte le finestre e mi assicuro che tutte le shell puntino ad altre directory. Come posso scoprire quale processo sta impedendo lo smontaggio?

    
posta Guillaume Coté 06.11.2010 - 08:25
fonte

4 risposte

21

apri un terminale:

fuser -c /media/KINGSTON

Produrrà qualcosa di simile a questo:

/media/KINGSTON/: 3106c 11086

Questo ti darà il pid dei processi usando questo volume. Il personaggio in più alla fine del pid darà alcune informazioni extra. (c in 3106c)

c - il processo sta usando il file come directory di lavoro corrente
m - il file è mappato con mmap
o - il processo lo sta usando come un file aperto
r - il file è la directory principale del processo
t - il processo sta accedendo al file come un file di testo
y: questo file è il terminale di controllo per il processo

Quindi per smontare basta uccidere i pid e riprovare lo smontaggio

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

Nota: per trovare il nome esatto dell'applicazione di questi pid puoi usare questo comando

cat /proc/<pid>/cmdline

Ad esempio: cat /proc/11086/cmdline

questo produrrà qualcosa di simile in basso.

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

Spero che questo ti aiuti

    
risposta data aneeshep 06.11.2010 - 09:01
fonte
7

Lo strumento più utile è lsof . Mostra quali file sono utilizzati da quali processi. Se /media/KINGSTON è un punto di montaggio (funziona anche il nome del dispositivo), il seguente comando mostra tutti i file in uso su questo punto di montaggio:

lsof /media/KINGSTON

Se esegui questo comando come un utente normale, mostrerà solo i tuoi processi¹. Esegui sudo lsof /media/KINGSTON per vedere tutti i processi degli utenti.

L'output di lsof assomiglia a questo:

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

La colonna COMMAND mostra il nome dell'eseguibile del programma e la colonna PID mostra l'ID del processo. La colonna NAME mostra il nome del file; potresti vedere (deleted) se il file è stato cancellato mentre era aperto (quando un file viene eliminato, non ha più un nome, ma esiste ancora fino a quando l'ultimo processo che lo usa non chiude il file). USER dovrebbe essere auto-esplicativo. Le altre colonne non contano qui tranne forse FD , che mostra come il file viene utilizzato dal processo:

  • cwd : directory di lavoro corrente
  • txt : il programma eseguibile²
  • mem : un file mappato in memoria (qui, pensalo come un file aperto)
  • un numero: un vero file aperto; una lettera successiva indica la modalità di apertura, ad esempio r per la lettura e w per la scrittura

Non esiste un modo meccanico per individuare la finestra in cui è aperto un file (questo in realtà non è tecnicamente significativo: se un processo ha diverse finestre, un file non è particolarmente associato a una finestra o un'altra), e nemmeno a una semplice modo di identificare la finestra di un processo (e ovviamente un processo non deve avere finestre). Ma solitamente il nome del comando e il nome del file sono sufficienti per localizzare l'autore del reato e chiudere correttamente il file.

Se non puoi chiudere il file e vuoi solo terminarlo, puoi uccidere il processo con kill 31421 (dove 31421 è l'ID del processo) o kill -HUP 31421 ("riagganciare"). Se l'uccisione semplice non fa il trucco, uccidi con estremo pregiudizio: kill -KILL 31421 .

C'è una GUI per lsof, glsof , ma non è ancora pronta per la prima serata, e non lo è confezionato per Ubuntu finora.

¹ Lsof può elencare alcune informazioni sui processi degli altri utenti, ma non rileva il punto di montaggio, quindi non li elenca se si specifica un punto di montaggio.
² Il codice eseguibile viene spesso chiamato testo nelle discussioni sui formati eseguibili.

    
risposta data Gilles 06.11.2010 - 13:59
fonte
2

Anche questo può aiutare:

lsof | grep \/media\/KINGSTON
    
risposta data Hashem Masoud 06.11.2010 - 09:02
fonte
2

Nel frattempo il comando del fusore è molto migliorato. Puoi eseguire l'intero lavoro con un singolo comando:

sudo fuser -ickv /"mountpoint"

Dove:

  • parametro k uccide il processo incriminato,
  • mentre v mostra in anticipo il processo e il suo utente
  • e i ti chiedono conferma.

Se alcuni processi resistono, riprova con fuser -ickv -9 (o più in generale con -SIGNAL ) che uccide quelli più testardi.
Ma troverai sempre un processo "immortale" ...!

    
risposta data prometheos 14.01.2016 - 01:56
fonte

Leggi altre domande sui tag