Immagino che a un certo punto ti sei chiesto se esiste un modo per mostrare i file aperti da un processo o da un utente. La cosa buona è che la risposta a questa domanda è lsof command.
Probabilmente sai già che il comando ls è l'abbreviazione di "list". lsof sta per "Elenca file aperti". Ed è esattamente quello che fa, elencando i file aperti per processi, utenti e ID processo.
Lascia che ti mostri alcuni degli usi più comuni del comando lsof.
esempi di comandi lsof
Se usi il comando lsof senza opzioni e argomenti, elencherà tutti i file aperti da tutti i processi nel sistema.
lsof
L'output dovrebbe essere questo:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
L'output è per lo più autoesplicativo, ma potresti ancora chiederti delle colonne FD e TYPE.
FD significa descrittore di file. Alcuni dei valori comuni per FD sono:
- cwd – Directory di lavoro corrente
- txt – File di testo
- mem – File mappato in memoria
- mmap – Dispositivo mappato in memoria
- NUMERO – Il descrittore di file effettivo. Contiene anche informazioni su quale autorizzazione file è aperto.
TYPE è un gioco da ragazzi. Specifica il tipo di file. Ecco alcuni esempi:
- REG – File normale
- DIR – Directory
- CHR – File speciale di caratteri
- FIFO – First In First Out
Fidati di me. Non vorresti eseguire il comando lsof senza argomenti.
Perché dico questo? Perché inizierà a inondare il tuo schermo con migliaia di risultati.
Se eseguo il comando lsof su un server Ubuntu e conto il numero di righe con il comando wc, ecco il risultato.
lsof | wc -l
11432
Sì! Giusto. Ci sono oltre undicimila file aperti da vari processi nel sistema.
Non preoccuparti. Il comando lsof è molto utile per il debug perché puoi vedere quali processi aprono quali file e quale file viene aperto da quale processo.
Se non sei loggato come root, l'output del comando lsof sarebbe molto limitato. È una buona idea usare sudo se hai effettuato l'accesso come utente non root.
1. Elenca tutti i processi che hanno aperto un file
Questo è semplice. Devi solo specificare il percorso del file.
lsof <path_to_file>
2. Elenca tutti i file aperti dall'utente
Questo è utile in un ambiente multiutente. Puoi elencare tutti i file aperti da un determinato utente nel modo seguente:
lsof -u <user_name>
Puoi anche specificare più di un utente in questo modo:
lsof -u user1, user2
o così:
lsof -u user1 -u user2
3. Elenca tutti i file aperti in una directory
Se ti stai chiedendo quali dei file sono stati aperti in una determinata directory, puoi usare il comando lsof con l'opzione +D.
lsof +D <path_to_directory>
La ricerca è ricorsiva. Quindi elencherà tutti i file aperti nella directory menzionata e tutte le sue sottodirectory.
4. Elenca tutti i file aperti da un processo
È necessario conoscere l'id del processo (pid) in questo caso. Se conosci l'id del processo, puoi usare l'opzione -p del comando lsof per trovare i file aperti da esso.
lsof -p <pid>
Puoi anche specificare più ID di processo.
lsof -p pid1, pid2, pid3
5. Elenca tutti i file aperti da un comando
Questo è particolarmente utile per il debug. Supponiamo di voler vedere quali file sono usati dal demone http, devi solo specificare il nome del comando (httpd nel nostro esempio).
lsof -c <command>
6. Trova aperto da un utente e un comando o un processo
Puoi combinare opzioni come utente e comando e un processo usando l'opzione –a. Pensalo come l'operatore AND. Questo ti offre un filtro aggiuntivo mentre cerchi di restringere la tua ricerca.
lsof -a -u user_name -c command_name
7. Elenca le connessioni di rete e le porte con il comando lsof
Puoi anche usare il comando lsof per trovare porte aperte o per trovare quale processo sta usando una porta.
Puoi archiviare tutti i tipi di porte aperte con l'opzione -i:
lsof -i
L'output potrebbe essere simile a questo:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
È inoltre possibile specificare il tipo di connessione di rete. Ad esempio, per elencare tutte le porte TCP aperte, puoi usare:
lsof -i tcp
Per scoprire quale processo sta utilizzando una porta specifica, puoi fornire il numero di porta:
lsof -i :<port_number>
Suggerimento bonus:utilizzo dell'operatore di negazione con lsof
Puoi utilizzare l'operatore di negazione per escludere un utente o un processo mentre usi il comando lsof.
Ad esempio, vuoi elencare tutti i file aperti da un utente diverso da root, usalo in questo modo:
lsof -u ^root
Il comando lsof diventa ancora più utile quando lo usi con il comando grep.
Spero che tu abbia imparato qualcosa di nuovo con questo articolo. Se hai domande o suggerimenti, lascia un commento qui sotto.