it-swarm.it

Come faccio a sapere quali processi impediscono lo smontaggio di un dispositivo?

A volte, desidero smontare un dispositivo USB con umount /run/media/theDrive, ma ottengo un drive is busy errore.

Come faccio a sapere quali processi o programmi accedono al dispositivo?

70
Stefan

Uso lsof | grep /media/whatever per scoprire cosa sta usando il mount.

Inoltre, considera umount -l (pigro umount) per impedire a nuovi processi di utilizzare l'unità durante la pulizia.

70
Peter Eisentraut

Il più delle volte, il miglior comando da usare è lsof (“ l i s t o penna f iles”).

lsof +f -- /media/usb0

dove /media/usb0 è il punto di montaggio dell'unità USB o di un altro filesystem da smontare. +f -- dice a lsof di trattare l'argomento successivo come un punto di montaggio; di solito, ma non sempre, riesce da solo, in modo che lsof /media/usb0 funziona anche. Questo trova file aperti (anche quelli non collegati), file mappati in memoria, directory correnti e alcuni usi più oscuri. Dovrai eseguire il comando come root per ottenere informazioni sui processi di altri utenti (e penso che ci siano unices in cui lsof deve essere eseguito come root).

Ci sono usi che lsof non troverà; questi sono rari su supporti rimovibili. Loro includono:

  • punti di montaggio: non è possibile smontare /foo Se /foo/bar è un punto di montaggio.
  • monta dispositivi: non puoi smontare /foo Se /foo/bar è un dispositivo a blocchi montato o un file normale montato in loop o se è l'origine di un bind mount di Linux.
  • Esportazione NFS: lsof non rileverà che un albero viene esportato da un server NFS del kernel.

Un altro comando che può servire in un pizzico è il fusore, che elenca solo i PID dei processi con file aperti sul dispositivo:

fuser -m /media/usb0

Apri file

I processi con file aperti sono i soliti colpevoli. Visualizzali:

lsof +f -- <mountpoint or device>

C'è un vantaggio nell'usare /dev/<device> Piuttosto che /mountpoint: Un mountpoint scompare dopo un umount -l, Oppure può essere nascosto da un mount sovrapposto.

fuser può anche essere usato, ma a mio avviso lsof ha un output più utile. Tuttavia fuser è utile quando si tratta di uccidere i processi che causano i tuoi drammi in modo da poter andare avanti con la tua vita.

Elenca i file su <mountpoint> (Vedi avvertenza sopra):

fuser -vmM <mountpoint>

Uccidi in modo interattivo solo i processi con i file aperti per la scrittura:

fuser -vmMkiw <mountpoint>

Dopo aver rimontato la sola lettura (mount -o remount,ro <mountpoint>), È sicuro (r) uccidere tutti i processi rimanenti:

fuser -vmMk <mountpoint>

Mountpoints

Il colpevole può essere il kernel stesso. Un altro filesystem montato sul filesystem che si sta provando a umount provocherà dolore. Controllare con:

mount | grep <mountpoint>/

Per i mount di loopback ( grazie Stephen Kitt ), controlla anche l'output di:

losetup -la

Inode anonimi (Linux)

Inode anonimi può essere creato da:

  • File temporanei (open con O_TMPFILE)
  • inotify orologi
  • [Eventfd]
  • [Eventpoll]
  • [Timerfd]

Questi sono il tipo di pokemon più sfuggente e compaiono nella colonna lsof di TYPE come a_inode (Che non è documentato nella lsof pagina man ).

Non verranno visualizzati in lsof +f -- /dev/<device>, Quindi dovrai:

lsof | grep a_inode

Per i processi di uccisione con inode anonimi, vedi: Elenca gli orologi inotify correnti (nome percorso, PID) .

inotify orologi (Linux)

Questo commento spiega perché inotify non dovrebbe impedire uno smontaggio, ma questa nota descrive le situazioni in cui :

uno smontaggio può bloccarsi nella chiamata vx_softcnt_flush(). Il blocco si verifica perché gli orologi inotify incrementano la variabile i_count E fanno sì che v_os_hold value Rimanga elevato fino a quando l'osservatore inotify rilascia la sospensione.

9
Tom Hale

Puoi usare lsof come ha detto Peter, o se sei sicuro di voler semplicemente uccidere tutte quelle cose e smontarlo, probabilmente puoi fare qualcosa del tipo:

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

Se usi GNOME, lo smontaggio tramite Nautilus visualizzerà un messaggio che indica quale processo sta ancora utilizzando l'unità e il file che sta utilizzando.

alt text

5
tshepang

Per (almeno) OpenBSD:

$ fstat /mnt/mountpoint

Ad esempio (usando doas per eseguire fstat come root come altrimenti vedremmo solo i nostri processi):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

In questo caso, non sarei in grado di smontare /usr/ports fino all'utente _pbuild aveva terminato di eseguire quei due make processi.

1
Kusalananda