Sotto Linux, molti oggetti sono considerati un file, indipendentemente dal fatto che l'oggetto sia effettivamente un file, dispositivo, directory o socket. Elencare un file è facile, c'è la shell integrata ls
per quello. E se un utente volesse vedere quali file sono attualmente aperti dal processo del server Web? O se quell'utente volesse scoprire quali file sono aperti in una determinata directory? Ecco dove lsof
entra in gioco. Immagina lsof
come ls
con l'aggiunta di "file aperti".
Si noti che mentre i BSD hanno un'utilità diversa per questo lavoro fstat
, anche molti altri tipi di Unix (Solaris, per esempio) possiedono lsof
. Le opzioni e i flag sono diversi sulle altre piattaforme, così come l'aspetto dell'output, ma in generale le conoscenze in questo articolo dovrebbero essere applicabili anche a loro.
Innanzitutto, diamo un'occhiata al formato lsof
dell'output e al modo in cui deve essere letto. L'output normale di lsof
senza parametri sarebbe simile al seguente. Questo è stato tagliato per essere leggibile.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 254,1 4096 2 /
init 1 root rtd DIR 254,1 4096 2 /
init 1 root txt REG 254,1 36992 7077928 /sbin/init
init 1 root mem REG 254,1 14768 7340043 /lib/x86_64-linux-gnu/libdl-2.13.so
init 1 root mem REG 254,1 1603600 7340040 /lib/x86_64-linux-gnu/libc-2.13.so
init 1 root mem REG 254,1 126232 7340078 /lib/x86_64-linux-gnu/libselinux.so.1
init 1 root mem REG 254,1 261184 7340083 /lib/x86_64-linux-gnu/libsepol.so.1
init 1 root mem REG 254,1 136936 7340037 /lib/x86_64-linux-gnu/ld-2.13.so
init 1 root 10u FIFO 0,14 0t0 4781 /run/initctl
Queste colonne indicano quanto segue:
- COMANDO - Il processo a cui appartiene un file aperto, in questo esempio tutto è correlato
init
.
- PID - Il numero di identificazione del processo di detto processo.
- UTENTE: l'utente con cui viene eseguito il processo. Perché
init
è quasi sempre root
.
- FD - Il descrittore di file del file, l'essere più comune:
cwd
- La directory di lavoro corrente (è possibile notare la somiglianza con il pwd
comando che stampa la directory di lavoro corrente).
rtd
- La directory principale di un processo.
txt
- A text file
, questo può significare un file di configurazione relativo al processo o il "codice sorgente" relativo (o appartenente a) al processo.
mem
- Un cosiddetto "file mappato in memoria", che significa un segmento di memoria virtuale (leggi: RAM) che è stato assegnato a un file.
- Un numero: il numero rappresenta il descrittore di file effettivo, il carattere dopo il numero è la modalità in cui viene aperto il file:
r
- Leggere.
w
- Scrivi.
u
- Leggere e scrivere.
- TYPE - Specifica il tipo effettivo del file, i più comuni sono:
REG
- Un file normale.
DIR
- Una directory.
FIFO
- Il primo che entra è il primo ad uscire.
- DISPOSITIVO: il numero maggiore e minore del dispositivo che contiene il file.
- SIZE - La dimensione del file, in byte.
- NODE - Il numero di inode del file.
- NOME: il nome del file.
Questo potrebbe essere un po 'travolgente per ora, ma se lavori con lsof
alcune volte, affonderà rapidamente nel tuo cervello.
Come accennato in precedenza, l'output di lsof
è stato ridotto qui. Senza alcun argomento o filtro, lsof
produce centinaia di righe di output che ti lasceranno solo confuso.
Esistono due approcci di base per risolvere questo problema:
- Utilizzare una o più delle
lsof
opzioni della riga di comando per restringere i risultati.
- Inoltra l'output, ad esempio
grep
.
Mentre quest'ultima opzione può sembrare più comoda poiché non dovrai memorizzare le lsof
opzioni della riga di comando, in genere non è così flessibile ed efficiente, quindi ci atterremo alla prima.
Immaginiamo che tu voglia aprire un file con il tuo editor di testo preferito e che l'editor di testo ti dice che può essere aperto solo in modalità di sola lettura perché un altro programma sta già accedendo ad esso. lsof
ti aiuterà a scoprire chi è l'autore:
lsof /path/to/your/file
Ciò produrrà un output simile al seguente:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Apparentemente, hai dimenticato di chiudere la sessione e quella più vecchia! Un problema molto simile si verifica quando provi a smontare una condivisione NFS e umount
ti dice che non è possibile perché qualcosa sta ancora accedendo alla cartella montata. Ancora una volta, lsof
può aiutarti a identificare il colpevole:
lsof +D /path/to/your/directory/
Nota la barra finale, questo è importante. Altrimenti lsof
supponiamo che intendi un file normale. Non essere confuso dal +
davanti alla bandiera - lsof
ha così tante opzioni da linea di comando che ha bisogno +
oltre alle più comuni -
. L'output sarebbe simile al seguente:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mocp 5637 music 4r REG 0,19 10147719 102367344 /home/Music/RMS_GNU_SONG.ogg
Ciò significa che il processo mocp
, con il PID 5637
, appartenente all'utente, music
ha aperto un file chiamato RMS_GNU_SONG.ogg
. Tuttavia, anche dopo aver chiuso quel processo, c'è ancora un problema: il volume NFS non può essere smontato.
lsof
ha un -c
flag che mostra i file aperti con un nome di processo arbitrario.
lsof -c mocp
Ciò produrrebbe un output simile al seguente:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
In questo esempio, c'è un'altra istanza di mocp
esecuzione, che ti impedisce di smontare la condivisione. Dopo aver interrotto tale processo, si desidera assicurarsi che l'utente music
non abbia altri file potenzialmente problematici aperti. lsof
ha un -u
flag per mostrare i file aperti da un utente specifico. Ricorda, un file non è sempre solo un file normale sul tuo disco rigido!
lsof -u music
Puoi anche passare più utenti, separati da virgole:
lsof -u music,moremusic
Una nota importante sul comportamento predefinito di lsof
: i risultati sono basati su OR , il che significa che vedrai i risultati dei file aperti da processi di proprietà dell'utente music
o dell'utente moremusic
. Se si desidera visualizzare i risultati che corrispondono ai processi di proprietà di entrambi gli utenti, è necessario passare il flag -a
:
lsof -au music, moremusic
Dato che entrambi gli utenti sono nel gruppo musicusers
, puoi anche elencare i file in base al gruppo:
lsof -g musicusers
È inoltre possibile combinare flag della riga di comando:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
Nell'ultima riga, abbiamo aggiunto un altro flag speciale ^
, che sta per un NOT logico . Se l'output è vuoto dopo aver eseguito quel comando, molto probabilmente lo smontaggio avrà esito positivo.
Negli esempi precedenti, abbiamo principalmente esaminato i file regolari. Che ne dici di socket e connessioni di rete?
Per elencare tutte le connessioni di rete correnti lsof
ha il -i
flag:
lsof -i
L'output è simile a quello che abbiamo visto finora ...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
owncloud 3509 myuser 25u IPv4 44946 0t0 TCP strix.local:34217->myserver.vultr.com:https (ESTABLISHED)
firefox 3612 myuser 82u IPv4 49663 0t0 TCP strix.local:43897->we-in-f100.1e100.net:https (ESTABLISHED)
ssh 3784 myuser 3u IPv4 10437 0t0 TCP strix.local:51416->someserver.in:ssh (ESTABLISHED)
wget 4140 myuser 3w IPv4 45586 0t0 TCP strix.local:54460->media.ccc.de:http (CLOSE_WAIT)
... fatta eccezione per una differenza: invece di nomi di file o directory, la colonna NAME
ora mostra le informazioni di connessione. Ogni connessione è composta dalle seguenti parti:
- Protocollo.
- Nome host locale.
- Porta di origine della connessione.
- Nome DNS di destinazione.
- Porto di destinazione.
- Stato della connessione.
Come con molti altri strumenti, è possibile annullare la risoluzione di nomi e porte DNS ( -n
e -P
, rispettivamente). Il flag -i
accetta parametri aggiuntivi. Puoi specificare se mostrare o meno tcp
, udp
o icmp
connessioni o determinate porte:
lsof -i :25
or
lsof -i :smtp
Ancora una volta, i parametri possono essere combinati. L'esempio seguente ...
lsof -i tcp:80
... ti mostrerà solo connessioni TCP usando la porta 80. Puoi anche combinarlo con le opzioni che già conosci dai file "classici":
lsof -a -u httpd -i tcp
Questo ti mostrerà tutte le connessioni TCP aperte dall'utente httpd
. Nota il -a
flag, che modifica il comportamento predefinito di lsof
(come menzionato in precedenza). Come con la maggior parte degli strumenti da riga di comando, puoi andare molto in profondità. Quanto segue mostrerà solo connessioni TCP il cui stato è "STABILITO":
lsof -i -s TCP:ESTABLISHED
A questo punto, dovresti avere una conoscenza di base su come lsof
funziona, insieme ad alcuni casi d'uso comuni. Per ulteriori letture, consultare la manpage di lsof
sul proprio sistema.