Il comando lsof elenca file, socket e pipe aperti. Puoi usare il comando lsof per vedere quali file sono tenuti aperti (come librerie o file di registro) e quali porte ascoltano i demoni. Puoi cercare i file aperti usando il comando lsof. lsof dovrebbe essere eseguito come superutente (root) per vedere tutti i file aperti. Se utilizzato senza argomenti/opzioni, lsof elenca tutti i file aperti per i processi attivi correnti.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 4587561 /sbin/init (deleted) init 1 root DEL REG 253,0 4849693 /lib64/libnss_files-2.12.so ..........
Comprensione dell'output del comando "lsof":
COMMAND: Command using the file. PID: PID of the file USER: Owner of the file FD: File descriptor. Different flags of File descriptor are as below: # : The number in front of flag(s) is the file descriptor number used by the process to associate with the file u : File open with Read and Write permission r : File open with Read permission w : File open with Write permission W : File open with Write permission and with Write Lock on entire file mem : Memory mapped file, usually for shared library TYPE: File type. Different flags of File type are as below: REG - Regular file DIR - Directory DEVICE: major, minor number of the device where file resides. SIZE/OFF: File size NODE: inode number NAME: File name
Trova i file aperti sotto un punto di montaggio
I file aperti in una directory particolare possono essere trovati usando lsof. Ad esempio, apri un file di testo (non chiuderlo, tienilo aperto) in una directory per la modifica utilizzando vi e controlla l'output lsof in quella directory in un'altra sessione.
# cd /test # vi a.txt
In un'altra sessione controlla l'output di lsof in quella directory:
# lsof /test COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2972 root cwd DIR 253,0 4096 262145 /test vi 3012 root cwd DIR 253,0 4096 262145 /test
Questo può essere utilizzato anche per smontare il punto di montaggio occupato. I processi che tengono occupato il punto di montaggio possono essere trovati utilizzando lsof.
Trovare informazioni su un processo particolare
Per ulteriori informazioni su un particolare processo, utilizzare l'opzione -p per lsof:
# lsof -p 8797
Mostra indirizzi di ascolto
I demoni possono collegarsi all'indirizzo IPv4 globale 0.0.0.0 oa indirizzi specifici, come 127.0.0.1 (localhost). Un demone legato all'indirizzo localhost sarà raggiungibile solo dal sistema stesso. Utilizzare le opzioni -i e -nP per lsof per mostrare le porte in ascolto senza ricerche su nomi host e servizi. Ad esempio, quanto segue mostra il demone httpd di Apache in esecuzione su localhost alla porta non standard di 7777. Altri sistemi non saranno in grado di connettersi a questi processi httpd:buono per la sicurezza, cattivo per la connettività remota.
Esempio:
# lsof -i -nP | grep httpd httpd 8616 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8614 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8623 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
Esempio:
Al contrario, il seguente processo OpenSSH sshd accetterà connessioni da altri sistemi, poiché è legato all'indirizzo 0.0.0.0, come indicato dal * che precede il numero di porta.
# lsof -i -P | grep sshd sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)
Alcune applicazioni sono in ascolto su molte porte diverse, come il Berkeley Internet Name Daemon (BIND) denominato daemon, versione 9.
Esempio:
# lsof -i -nP | grep ^named named 9865 named 5u IPv6 0x03348be0 0t0 UDP *:53 named 9865 named 6u IPv6 0x0566re80 0t0 TCP *:53 (LISTEN) named 9865 named 7u IPv4 0x03456b10 0t0 UDP 127.0.0.1:53 named 9865 named 8u IPv4 0x01870570 0t0 TCP 127.0.0.1:53 (LISTEN) named 9865 named 9u IPv4 0x03456a40 0t0 UDP *:49164 named 9865 named 10u IPv6 0x03456970 0t0 UDP *:49165 named 8888 named 11u IPv4 0x0186fd54 0t0 TCP *:953 (LISTEN) named 8888 named 13u IPv4 0x01387ee0 0t0 UDP 168.1.863.1:67 named 8888 named 14u IPv4 0x099899ce4 0t0 TCP 168.1.863.1:67(LISTEN)
Trova i file aperti da un processo
Un processo potrebbe non funzionare per altri motivi, come un firewall, un controllo del servizio di accesso come tcp_wrappers o qualche altra configurazione errata. Utilizzare ping, telnet o nmap per verificare da un sistema remoto se qualcos'altro potrebbe bloccare la richiesta, oppure eseguire tcpdump per vedere se le connessioni lasciano l'origine o arrivano al sistema di destinazione.
Esempio
Per vedere quali file vengono aperti dai processi i cui nomi iniziano con "t" (telnetd...) e bash. E per vedere quali file vengono aperti da init usa i seguenti comandi:
# lsof -c t # lsof -c bash # lsof -c init
Esempio
Per vedere quali file vengono aperti dai processi i cui nomi iniziano per "testuser", ma esclude quelli il cui proprietario è l'utente "tom", usa il comando seguente:
# lsof -c testuser -u ^tom
Trova i processi aperti dagli utenti
Per vedere quali processi vengono aperti dagli utenti myuser e tom, utilizzare il comando seguente:
# lsof -u myuser,tom
Trovare la porta utilizzata dal processo
Per vedere quali processi stanno utilizzando una particolare porta, usa il seguente comando:
# lsof -i TCP:389
Come trovare il numero di file aperti per un nome di processo e il pid di processo ordinato per numero di file aperti?
Questo può essere interessante quando viene visualizzato l'errore "troppi file aperti". Usa lo script seguente che utilizza il comando lsof:
# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Trova processi utilizzando il numero massimo di descrittori di file
I limiti dei descrittori di file possono essere impostati utilizzando il seguente comando per una shell:
# ulimit -n 65536
Usa il comando "lsof" per trovare cosa sta usando i descrittori di file sul sistema.
# lsof -g | awk '{print $2}' | sort -u > /tmp/lsof_sort.txt
# for var in `cat /tmp/lsof_sort.txt` do echo `echo "$var ---- "``grep -x $var /tmp/lsof.txt | wc -l` done
Questo elencherà tutti i processi e il numero corrispondente di file aperti da loro. Puoi scegliere i processi che hanno il maggior numero di file aperti e vedere quali sono.