Lo strumento di comando “lsof” in Linux è uno dei tanti strumenti integrati che è super utile per controllare la “lista dei file aperti”. Sì, il termine “lsof” è l’abbreviazione del compito.
Ci sono un certo numero di processi in esecuzione nel sistema tutto il tempo, accedendo a diversi file del sistema. Questi file potrebbero essere file su disco, script, socket di rete, dispositivi, pipe con nome e altri. Usando “lsof”, è possibile eseguire molte cose, come il debug. È anche abbastanza utile per gli amministratori di sistema per capire quali file sono accessibili da quali processi. Uno degli scenari più utili che ho trovato è quando si sta per smontare un filesystem ma si sta ancora accedendo ad esso.
Senza ulteriori indugi, cominciamo con “lsof”! Presumo che il tuo attuale sistema UNIX/Linux abbia già installato “lsof”.
Questo riporta il percorso completo del comando, in questo caso, “lsof”.
lsof -v
Questo riporta informazioni approfondite sulla versione di “lsof”, inclusa la data di compilazione del binario, la versione del compilatore, i flag del compilatore e altro.
Uso base di “lsof”
Esegui “lsof” da solo.
Questo riporta una GRANDE lista di tutti i file a cui il sistema sta accedendo al momento di eseguire il comando.
Mentre tutti i campi sono autoesplicativi, la maggior parte si confonde sulle colonne “FD” e “TYPE” e sui loro valori. Controlliamole.
FD: Abbreviazione di “File Descriptor”. Vengono fuori i seguenti valori.
- cwd: Current working directory
- rtd: Root directory
- txt: Testo del programma (dati, codice e altro)
- mem: File mappato in memoria
- err: Errore di informazione FD
- mmap: Dispositivo mappato in memoria
- ltx: Testo libreria condivisa (dati e codice)
- m86: DOS Merge mapped file
Ci sono anche altri valori che noterete nella colonna, come “1u” seguito dal valore u, r, w, ecc. Cosa significano?
- r: Accesso in lettura
- w: Accesso in scrittura
- u: Accesso in lettura e scrittura
- – : Modo sconosciuto e contiene un carattere di blocco
- ‘ ‘: Il modo è sconosciuto e non c’è un carattere di blocco
TYPE: Descrive il tipo di file e la sua identificazione. I valori sono i seguenti.
- DIR: Directory
- CHR: File a caratteri speciali
- REG: File regolare
- FIFO: First in, first out
File aperti specifici dell’utente
Linux è una brillante piattaforma multi-utente. Più utenti possono accedere al sistema allo stesso tempo ed eseguire operazioni di cui hanno il permesso.
Per controllare i file a cui sta accedendo un certo utente, esegui il seguente comando.
Tuttavia, per controllare gli utenti di grado superiore, “lsof” avrà bisogno dei privilegi di “superuser”.
Che ne dici di controllare tutti i comandi e i file a cui accede un certo utente? Esegui il seguente.
Ancora una volta, per gli utenti di grado superiore, “lsof” avrà bisogno del privilegio di “superuser”.
Processi in esecuzione specifici della porta
Per scoprire tutti i processi che stanno attualmente usando una certa porta, chiama “lsof” con il flag “-i” seguito dalle informazioni su protocollo e porta.
:<service|port>
Per esempio, per controllare tutti i programmi che attualmente accedono alla porta 80 su protocollo TCP/IP, eseguire il seguente comando.
Questo metodo può anche essere usato per mostrare tutti i processi che stanno usando le porte entro un certo intervallo, per esempio, da 1 a 1000. La struttura del comando è simile a prima con una piccola magia nella parte del numero di porta.
Processi specifici del protocollo
Qui ci sono 2 esempi che mostrano i processi che stanno usando i protocolli IPv4 e IPv6.
Elenco connessioni di rete
Il seguente comando riporta tutte le connessioni di rete del sistema corrente.
Escludere con ^
Sì, possiamo escludere specifici utenti, porte, FD e altri usando il carattere “^”. Tutto quello che devi fare è usarlo con cautela per non rovinare l’intero output.
In questo esempio, escludiamo tutti i processi dell’utente “root”.
Ci sono altri modi di usare questo meccanismo di esclusione con “lsof”, per esempio, con i flag come “-c”, “-d” ecc. Non tutte le bandiere supportano questo meccanismo. Ecco perché raccomando di provare una demo con questo metodo con qualsiasi bandiera prima di implementarlo in alcuni script.
PID search
PID è una proprietà importante di qualsiasi processo in esecuzione sul sistema. Permette un’individuazione più precisa di un certo processo. Il nome del processo non è molto utile in molte situazioni perché lo stesso binario può creare copie di se stesso ed eseguire diversi compiti in parallelo.
Se non sai come ottenere il PID di un processo, usa semplicemente “ps” per elencare tutti i processi in esecuzione e filtra l’output usando “grep” con il nome del processo e/o i comandi.
Ora, esegui il filtraggio usando “grep”.
Ora, controlla a quali file accede quel PID.
Elenco dei file aperti per un dispositivo specifico
La funzionalità di “lsof” non è solo limitata a queste funzioni. Potete anche filtrare il risultato di “lsof” in base al dispositivo. Per questo scopo, il comando avrà un aspetto simile a questo.
Questo comando è super utile per scoprire tutti i processi in esecuzione con le loro informazioni sul proprietario che accedono a un particolare filesystem. Se hai problemi a smontare un filesystem, questo è il modo migliore per farlo.
Lista dei file aperti sotto una directory
Simile all’esempio precedente, basta passare il percorso della directory a “lsof” per scoprire se qualche processo vi sta accedendo.
Nota: “lsof” controllerà la directory in modo ricorsivo, quindi può richiedere tempo.
Bonus: termina tutte le attività dell’utente
Siate estremamente cauti con questa parte perché può semplicemente incasinare tutto ciò che un utente sta facendo. Il seguente comando ucciderà tutti i processi in esecuzione di un utente.
Pensieri finali
Le caratteristiche di “lsof” non si fermano qui. Quelle menzionate qui sono quelle di cui avremo più bisogno giorno per giorno. Ci sono molte altre funzionalità di “lsof” che possono tornare utili (in casi specifici, ovviamente).
Per tutte le caratteristiche disponibili e il loro uso, controllate le pagine man e info di “lsof”.
Godetevi!