A volte, ci troviamo di fronte a situazioni in cui non possiamo smontare un disco poiché dice che i file vengono utilizzati, ma non riusciamo a capire a quale file si riferisca. In tali situazioni, possiamo controllare quali file sono aperti da quale processo è in esecuzione sul sistema.
Questo può essere fatto usando il comando lsof, che significa Elenca file aperti. Poiché Linux considera tutto, incluse directory, dispositivi, socket e così via come file, possiamo usare lsof per identificare facilmente tutti i file aperti.
Se eseguiamo semplicemente lsof, elencherà tutti i file aperti che appartengono a qualsiasi processo attivo sul sistema. Se l'output è lungo, possiamo usare il comando less per scorrere l'output:
# lsof | less
L'output mostrato ha colonne come Command, PID, User, FD, Type, Device e così via, per una migliore comprensione dei file. La colonna FD contiene informazioni sulla descrizione del file, come la directory di lavoro corrente (CWD), la directory principale (RTD), il testo del programma (TXT) e così via. Se la colonna FD contiene informazioni come 0u, 1u e così via, il numero indica il descrittore di file effettivo e l'alfabeto indica le diverse modalità (accesso in lettura, accesso in scrittura e accesso in lettura/scrittura).
se incontri l'errore seguente durante l'esecuzione del comando lsof:
lsof: command not found
ypu può installare il pacchetto seguente secondo la tua scelta di distribuzione.
Distribuzione | Comando |
---|---|
OS X | brew install lsof |
Debian | apt-get install lsof |
Ubuntu | apt-get install lsof |
Alpino | apk aggiungi lsof |
Arch Linux | pacman -S lsof |
Kali Linux | apt-get install lsof |
CentOS | yum install lsof |
Fedora | dnf install lsof |
Raspbian | apt-get install lsof |
Opzioni lsof usate di frequente
- -c x :mostra solo i file aperti da processi il cui eseguibile inizia con i caratteri specificati da x.
- -i x :invece di mostrare i file aperti, mostra i socket il cui indirizzo Internet è x. Se x non è specificato, mostra tutte le connessioni IP. Funzionalmente equivalente a netstat –anp.
- -u nome utente :mostra solo i file aperti dal nome utente.
- -P :non convertire i numeri di porta in nomi di porta (ad esempio, mostra 25 invece di smtp).
ldi esempi di comandi
La semplice esecuzione dei comandi lsof ci fornisce un elenco di tutti i file aperti sul sistema. Usando l'opzione -u e specificando il nome utente, otteniamo un elenco di file aperti per un particolare utente. Quando utilizziamo l'opzione -i e specifichiamo un numero di porta, otteniamo informazioni su qualsiasi processo in esecuzione su quella porta. Quando utilizziamo entrambe le opzioni -i e -u con un particolare nome utente, otteniamo informazioni sui file e sui comandi a cui accede quell'utente.
1. Trova i processi che hanno un determinato file aperto:
# lsof path/to/file
2. Trova il processo che ha aperto una porta Internet locale:
# lsof -i :port
3. Emetti solo l'ID processo (PID):
# lsof -t path/to/file
4. Elenca i file aperti dall'utente specificato:
# lsof -u username
5. Elenca i file aperti dal comando o processo specificato:
# lsof -c process_or_command_name
6. Elenca i file aperti da un processo specifico, dato il suo PID:
# lsof -p PID
7. Elenca i file aperti in una directory:
# lsof +D path/to/directory
8. Trova il processo in ascolto su una porta TCP IPv6 locale e non convertire i numeri di rete o di porta:
# lsof -i6TCP:port -sTCP:LISTEN -n -P
9. Elenca i processi che hanno la tua home directory aperta:
# lsof ~
10. Elenca tutti i file aperti nella tua home directory:
# lsof +D
11. Elenca i file aperti dai processi i cui nomi iniziano con "i" e il cui proprietario è "geek":
# lsof -a -c i -u geek
12. Elenca i file utilizzando la porta TCP 80, ripetendo ogni due secondi fino alla chiusura di lsof:
Le ultime parole
lsof elenca i file aperti. Poiché tutto in Linux è un file, questo strumento può darti una fantastica quantità di informazioni sul tuo sistema in esecuzione. Viene utilizzato principalmente per indicare quali processi hanno i file aperti, ma può anche essere utilizzato per visualizzare le informazioni sulla connessione TCP e UDP, tra le altre cose.