Come faccio a sapere quale processo sta impedendo un umount?


26

Quando io 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 sapere quale processo impedisce l'umount?


3
Penso che tu abbia un refuso qui, dubito che il comando abbia restituito "Come faccio a sapere quale processo sta consumando la mia larghezza di banda?" ...;) Qualche possibilità che tu possa modificare la domanda per favore?
8128

Risposte:


24

aprire un terminale:

fuser -c /media/KINGSTON

Produrrà qualcosa del genere:

/media/KINGSTON/: 3106c 11086

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

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

Quindi per smontare basta uccidere quei pids e riprovare a smontare

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

Nota: per trovare il nome esatto dell'applicazione di questi pid è possibile utilizzare questo comando

cat /proc/<pid>/cmdline

Per esempio : cat /proc/11086/cmdline

questo produrrà qualcosa di simile al di sotto.

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

Spero che questo possa aiutare


2
fuser -ck lo ucciderebbe anche.
João Pinto,

3
Suggerirei di ucciderli prima senza l'opzione -9, per dare a quelle applicazioni la possibilità di chiudere in modo pulito. E suggerirei di usare ps <pid>invece di modificare i file in / proc per vedere il nome del comando e gli argomenti.
Marius Gedminas,

Seguo la tua procedura per trovare il processo, è Thunar - Deamon. Non ci sono personaggi extra che danno informazioni extra. Non l'ho ancora ucciso, mi preoccupo dell'impatto che potrebbe avere su altre cose in esecuzione.
Guillaume Coté,

7

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

lsof /media/KINGSTON

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

L'output lsofè simile al seguente:

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 COMMANDcolonna mostra il nome dell'eseguibile del programma e la PIDcolonna mostra l'ID del processo. La NAMEcolonna mostra il nome del file; potresti vedere (deleted)se il file è stato eliminato mentre era aperto (quando un file viene eliminato, non ha più un nome, ma esiste ancora fino a quando l'ultimo processo che lo utilizza non chiude il file). USERdovrebbe essere autoesplicativo. 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 rper la lettura e wper la scrittura

Non esiste un modo meccanico per individuare la finestra in cui è aperto un file (ciò non è tecnicamente significativo: se un processo ha più finestre, un file non è particolarmente associato a una finestra o all'altra), né a un semplice modo di identificare la finestra di un processo (e ovviamente un processo non deve avere finestre). Ma di solito il nome del comando e il nome del file sono sufficienti per individuare l'autore del reato e chiudere correttamente il file.

Se non riesci a chiudere il file e vuoi solo terminarlo, puoi terminare il processo con kill 31421(dove si 31421trova l'ID del processo) o kill -HUP 31421("riaggancia"). Se uccisione pianura non fa il trucco, uccidere con estremo pregiudizio: kill -KILL 31421.

C'è una GUI per lsof, glsof , ma non è ancora del tutto pronta per la prima serata, e finora non è stata creata per Ubuntu.

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



2

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

$ sudo fuser -ickv /"mountpoint"

Dove:

  • il parametro kuccide il processo offensivo,
  • mentre vmostra in anticipo il processo e il suo utente
  • e iti chiede conferma.

Se qualche processo resiste, riprovare con fuser -ickv -9(o più in generale con -SIGNAL) che uccide quelli più ostinati.
Ma troverai sempre un processo "immortale" ...!

In questi casi ultimamente ho imparato a usare

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

come ultima risorsa, che finora ha funzionato per me ogni volta.


Ho trovato il processo immortale, il mio tentativo fallito di usare vboxmanage. -_-
sudo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.