lsof sta per List Open Files.
È facile ricordare il comando lsof se lo pensi come "ls + of", dove ls sta per list e of sta per file aperti.
È un'utilità della riga di comando che viene utilizzata per elencare le informazioni sui file aperti da vari processi. In unix, tutto è un file (pipe, socket, directory, dispositivi, ecc.). Quindi, usando lsof, puoi ottenere le informazioni su tutti i file aperti.
1. Introduzione a lsof
Digitando semplicemente lsof verrà fornito un elenco di tutti i file aperti appartenenti a tutti i processi attivi.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root 0u CHR 1,3 0t0 4369 /dev/null init 1 root 1u CHR 1,3 0t0 4369 /dev/null init 1 root 2u CHR 1,3 0t0 4369 /dev/null init 1 root 3r FIFO 0,8 0t0 6323 pipe ...
Per impostazione predefinita, viene visualizzato un file per riga. La maggior parte delle colonne sono autoesplicative. Spiegheremo i dettagli su un paio di colonne criptiche (FD e TYPE).
FD – Rappresenta il descrittore di file. Alcuni dei valori di FD sono,
- cwd – Directory di lavoro corrente
- txt – File di testo
- mem – File mappato in memoria
- mmap – Dispositivo mappato in memoria
- NUMERO – Rappresenta il descrittore di file effettivo. Il carattere dopo il numero, ad esempio '1u', rappresenta la modalità di apertura del file. r per leggere, w per scrivere, u per leggere e scrivere.
TIPO – Specifica il tipo di file. Alcuni dei valori di TYPEs sono,
- REG – File normale
- DIR – Directory
- FIFO – First In First Out
- CHR – File speciale di caratteri
Per un elenco completo di FD &TYPE, fare riferimento a man lsof.
2. Elenca i processi che hanno aperto un file specifico
Puoi elencare solo i processi che hanno aperto un file specifico, fornendo il nome del file come argomenti.
# lsof /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
3. Elenca i file aperti in una directory
Puoi elencare i processi che hanno aperto i file in una directory specificata usando l'opzione '+D'. +D ricorderà anche le sottodirectory. Se non vuoi che lsof ricorra, usa l'opzione '+d'.
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
4. Elenca i file aperti in base ai nomi dei processi che iniziano con
Puoi elencare i file aperti dai nomi dei processi che iniziano con una stringa, usando l'opzione '-c'. -c seguito dal nome del processo elencherà i file aperti dal processo che iniziano con quel nome del processo. Puoi dare più opzioni -c su una singola riga di comando.
# lsof -c ssh -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so ... ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
5. Elenca i processi utilizzando un punto di montaggio
A volte, quando proviamo a smontare una directory, il sistema visualizzerà l'errore "Dispositivo o risorsa occupata". Quindi dobbiamo scoprire quali sono tutti i processi che utilizzano il punto di montaggio e uccidere quei processi per smontare la directory. Usando lsof possiamo trovare quei processi.
# lsof /home
Funzionerà anche quanto segue.
# lsof +D /home/
6. Elenca i file aperti da un utente specifico
Per trovare l'elenco dei file aperti da utenti specifici, usa l'opzione '-u'.
# lsof -u lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
A volte potresti voler elencare i file aperti da tutti gli utenti, aspettati alcuni 1 o 2. In tal caso puoi usare '^' per escludere solo l'utente particolare come segue
# lsof -u ^lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode udisks-da 1584 root cwd DIR 8,1 4096 2 /
Il comando precedente elencava tutti i file aperti da tutti gli utenti, aspettati l'utente 'lakshmanan'.
7. Elenca tutti i file aperti da un processo specifico
Puoi elencare tutti i file aperti da un processo specifico usando l'opzione '-p'. A volte sarà utile ottenere maggiori informazioni su un processo specifico.
# lsof -p 1753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt bash 1753 lakshmanan rtd DIR 8,1 4096 2 / bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0 ...
8. Termina tutti i processi che appartengono a un particolare utente
Quando vuoi uccidere tutti i processi che hanno file aperti da un utente specifico, puoi usare l'opzione '-t' per elencare in output solo l'id del processo del processo e passarlo per kill come segue
# kill -9 `lsof -t -u lakshmanan`
Il comando precedente ucciderà tutti i processi appartenenti all'utente 'lakshmanan', che ha file aperti.
Allo stesso modo puoi anche usare '-t' in molti modi. Ad esempio, per elencare l'id di un processo che ha aperto /var/log/syslog può essere fatto da
# lsof -t /var/log/syslog 489
Parlando di kill, sapevi che ci sono 4 modi per uccidere un processo?
9. Combina più opzioni di elenco usando O/E
Per impostazione predefinita, quando utilizzi più di un'opzione di elenco in lsof, verranno messe in OR. Ad esempio,
# lsof -u lakshmanan -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2 bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2 ...
Il comando precedente utilizza due opzioni di elenco, '-u' e '-c'. Quindi il comando elencherà il processo appartiene all'utente "lakshmanan" e il nome del processo inizia con "init".
Ma quando vuoi elencare un processo che appartiene all'utente "lakshmanan" e il nome del processo inizia con "init", puoi usare l'opzione "-a".
# lsof -u lakshmanan -c init -a
Il comando precedente non produrrà nulla, perché non esiste alcun processo denominato "init" appartenente all'utente "lakshmanan".
10. Esegui lsof in modalità ripetizione
lsof supporta anche la modalità Ripeti. Prima elencherà i file in base ai parametri forniti, quindi ritarderà per secondi specificati e di nuovo elencherà i file in base ai parametri forniti. Può essere interrotto da un segnale.
La modalità di ripetizione può essere abilitata utilizzando '-r' o '+r'. Se viene utilizzato '+r', la modalità di ripetizione termina quando non vengono trovati file aperti. '-r' continuerà a elencare, ritardare, elencare fino a quando non viene fornito un interrupt indipendentemente dal fatto che i file siano aperti o meno.
Ogni uscita del ciclo verrà separata utilizzando '======='. Specificare anche il ritardo di tempo come '-r' | '+r'.
# lsof -u lakshmanan -c init -a -r5 ======= ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh =======
Nell'uscita sopra, per i primi 5 secondi, non c'è uscita. Dopodiché viene avviato uno script chiamato "inita.sh" che elenca l'output.
Trovare una connessione di rete
Anche le connessioni di rete sono file. Quindi possiamo trovare informazioni su di loro usando lsof.
11. Elenca tutte le connessioni di rete
Puoi elencare tutte le connessioni di rete aperte utilizzando l'opzione '-i'.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060 cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
Puoi anche utilizzare "-i4" o "-i6" per elencare solo "IPV4" o "IPV6" rispettivamente.
12. Elenca tutti i file di rete utilizzati da un processo specifico
Puoi elencare tutti i file di rete utilizzati da un processo come segue
# lsof -i -a -p 234
Puoi anche utilizzare quanto segue
# lsof -i -a -c ssh
Il comando precedente elencherà i file di rete aperti dai processi che iniziano con ssh.
13. Elenca i processi in ascolto su una porta particolare
Puoi elencare i processi in ascolto su una porta particolare usando "-i" con ":" come segue
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14. Elenca tutte le connessioni TCP o UDP
Puoi elencare tutte le connessioni TCP o UDP specificando il protocollo usando '-i'.
# lsof -i tcp; lsof -i udp;
15. Elenca tutti i file NFS (Network File System)
Puoi elencare tutti i file NFS usando l'opzione '-N'. Il seguente comando lsof elencherà tutti i file NFS utilizzati dall'utente 'lakshmanan'.
# lsof -N -u lakshmanan -a