Il comando lsof spiegato agli utenti Mac

Impara a usare il comando lsof per scoprire quali processi tengono aperti dei file sul tuo Mac. Una guida per sviluppatori e utenti esperti.

Il tuo disco esterno non si espelle. macOS ti restituisce quel messaggio esasperante e vago secondo cui «uno o più programmi potrebbero utilizzarlo». Quali programmi? Non te lo dice. È qui che entra in gioco lsof.

Il nome sta per «list open files» (elenca i file aperti), ed è esattamente ciò che fa. Sui sistemi basati su Unix come macOS, quasi tutto è trattato come un file: comprese le connessioni di rete, i dispositivi e i volumi dei dischi. Quando non riesci a espellere un disco, lsof ti dice con precisione quale processo lo tiene in ostaggio.

Sintassi di base

Il modo più semplice di usare lsof per i problemi di espulsione è:

lsof /Volumes/YourDriveName

Sostituisci «YourDriveName» con il nome reale del tuo disco. Se il nome contiene degli spazi, racchiudi l’intero percorso tra virgolette:

lsof "/Volumes/My Backup Drive"

Questo restituisce un elenco di tutti i processi che hanno un handle di file aperto su quel volume. Ogni riga mostra il nome del processo, il suo identificativo (PID), l’utente che lo esegue e le informazioni sul file specifico a cui si sta accedendo.

Leggere l’output

Un tipico output di lsof si presenta più o meno così:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mds_store  1234   root   4r   REG   1,12   524288  ...  /Volumes/External/.Spotlight-V100/...
Finder     5678   you    3r   DIR   1,12     1024  ...  /Volumes/External

Le colonne che contano di più sono COMMAND (il nome del processo), PID (l’identificativo del processo che useresti per terminarlo) e NAME (il percorso effettivo del file a cui si accede).

La colonna FD mostra come viene utilizzato il file. Un numero seguito da «r» indica accesso in lettura, «w» indica scrittura e «u» indica sia lettura sia scrittura. Se vedi «cwd», significa che il processo ha quella posizione come directory di lavoro corrente. Questo accade quando hai una finestra del Terminale aperta su una cartella del disco.

Scoprire cosa sta bloccando il disco

Per i problemi di espulsione, in genere ti basta sapere quali nomi di processo compaiono. Tra i colpevoli più comuni ci sono mds e mds_stores (l’indicizzazione di Spotlight), Finder, QuickLookUIService (la generazione delle anteprime) e fsevents (il monitoraggio del filesystem).

Se vedi molto output e vuoi restringerlo, puoi usare grep:

lsof /Volumes/YourDriveName | grep -v "^COMMAND"

Così rimuovi la riga di intestazione e vedi solo i processi effettivi. Se vuoi soltanto i nomi univoci dei processi:

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

Opzioni utili

L’opzione -c filtra per nome del comando. Se sospetti che il problema sia Spotlight:

lsof -c mds /Volumes/YourDriveName

Questo mostra solo i processi il cui nome inizia con «mds».

L’opzione +D elenca in modo ricorsivo tutti i file aperti in una directory:

lsof +D /Volumes/YourDriveName

È più completa della sintassi di base, ma può essere lenta su dischi grandi con molti file.

Per vedere quali processi un determinato utente ha aperti sul disco:

lsof -u yourusername /Volumes/YourDriveName

Usare lsof senza sudo

Per impostazione predefinita, lsof mostra solo i processi appartenenti al tuo account utente. I processi di sistema eseguiti da root (come mds di Spotlight) non compaiono, a meno che tu non esegua lsof con sudo:

sudo lsof /Volumes/YourDriveName

Dovrai inserire la tua password. Per risolvere i problemi di espulsione, usare sudo è quasi sempre necessario, dato che i processi di sistema sono spesso i responsabili del blocco.

Terminare il processo che blocca

Una volta individuato l’identificativo del processo (PID) nell’output di lsof, puoi terminarlo:

kill 1234

Sostituisci 1234 con il PID effettivo. Se non funziona, puoi forzarlo:

kill -9 1234

Fai attenzione con questo comando. Terminare processi di sistema come mds può causare problemi temporanei. Di solito il processo si riavvia automaticamente, ma potresti notare Spotlight comportarsi in modo strano per un minuto. Terminare applicazioni come il Finder è in genere sicuro: macOS riavvia il Finder automaticamente.

Per le applicazioni che ti appartengono (come una finestra del Terminale con una shell ferma nella directory del disco), è più pulito chiudere normalmente l’applicazione o spostarsi fuori dal disco prima di provare a espellerlo.

Scenari comuni

Terminale con la directory corrente sul disco: se hai fatto cd in una cartella del disco esterno, quel processo della shell terrà aperto il disco. Spostati altrove (cd ~) oppure chiudi quella finestra del Terminale.

Finestre del Finder: se il Finder ha una finestra aperta sul disco, o anche solo il disco selezionato nella barra laterale, può impedire l’espulsione. Chiudi tutte le finestre del Finder che mostrano il contenuto del disco.

Indicizzazione di Spotlight: i processi mds, mds_stores e mdworker indicizzano automaticamente i nuovi dischi. Puoi aspettare che finiscano, disattivare l’indicizzazione con sudo mdutil -i off /Volumes/YourDriveName, oppure terminarli direttamente.

App in background con file aperti: alcune applicazioni continuano a fare riferimento ai file recenti anche dopo che hai chiuso i documenti. Le app creative come Photoshop o gli editor video sono colpevoli frequenti. Chiudere completamente l’app di solito rilascia i file.

Oltre la riga di comando

Se non ti senti a tuo agio con il Terminale o non vuoi decifrare l’output di lsof ogni volta che devi staccare un disco, esistono opzioni grafiche.

Monitoraggio Attività può mostrarti i file aperti di un processo specifico, ma devi già sapere quale processo ispezionare. Non risponde facilmente alla domanda «cosa sta usando questo disco?».

Ejecta è stato creato appositamente per questo problema. Mostra i dischi collegati, individua quali processi stanno bloccando ciascuno di essi e ti permette di chiuderli con un clic. È sostanzialmente un’interfaccia grafica che avvolge il lavoro investigativo richiesto da lsof, con in più l’intelligenza necessaria per gestire i processi di sistema in sicurezza.

La riga di comando è potente per chi la preferisce, ma non dovrebbe essere obbligatoria per qualcosa di semplice come staccare un disco.

Se preferisci non usare il Terminale ogni volta, Ejecta ti mostra esattamente quale processo sta bloccando il disco — e ti permette di chiuderlo con un clic, direttamente dalla barra dei menu.

Acquista ora — $9.99