Guida all'uso del comando "lsof" per un processo
Se sei un utente abituale di sistemi Linux o Unix, avrai sicuramente sentito la frase "In Linux, tutto è un file". Questo può essere classificato come un'eccessiva semplificazione del concetto, ma si rivela molto utile per capire come funzionano i file nel sistema Linux.
Non tutto ciò che appare nell'ambiente Linux deve essere un file. A volte può essere un processo, può essere un file speciale che rappresenta le informazioni sull'hardware, le directory e altre cose.
Questo tutorial ti guiderà nella ricerca di tutti i file aperti per un particolare processo in Linux.
Introduzione a lsof
Comando
Il bello del sistema Linux è che puoi controllare e gestire l'intero sistema tramite il terminale, a patto di conoscere bene i comandi. Una volta che i comandi sono noti, tutte le attività sul terminale diventano una passeggiata.
lsof
sta per 'Elenco dei file aperti'. Una volta che conosci la versione lunga del comando, diventa molto facile per te capire e utilizzare il comando in modo produttivo.
Il lsof
Il comando visualizza gli elenchi di file aperti, socket e pipe. Puoi facilmente cercare i file aperti usando questo comando. Quando il lsof
comando viene utilizzato senza alcuna opzione visualizza tutti i file aperti rispetto ai processi attivi in esecuzione.
Nota: Assicurati di usare sudo
durante l'esecuzione dei comandi.
Usando il lsof
Comando
Studieremo l'output di lsof
comando in dettaglio. Studia il seguente comando.
sudo lsof | meno
Nota: Se eseguiamo direttamente il lsof
comando, l'output sarà molto grande e potrebbe creare confusione per procedere ulteriormente. Quindi, qui ho usato lsof | meno
comando per comodità del tutorial.
Produzione:
gaurav@ubuntu:~$ sudo lsof | less COMANDO PID TID UTENTE FD TIPO DISPOSITIVO DIMENSIONE/OFF NOME NODO kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt unknown /proc/31/exe netns 32 root cwd DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt unknown /proc/32/exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root rtd DIR 8,8 4096 2 / rcu_tasks 33 root txt sconosciuto /proc/33/exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt sconosciuto /proc/34/exe
Di seguito sono riportati gli attributi che vengono visualizzati utilizzando il lsof
comando.
Parametro | Descrizione |
---|---|
Comando | Mostra il nome del comando che apre il file. |
PID | Numero identificativo del processo che apre il file. |
TID | Numero identificativo thread. Può essere un thread o un numero di attività. |
Utente | ID utente o nome dell'utente titolare del processo. |
FD | Mostra il descrittore di file del file. |
Tipo | Tipo di nodo associato al file. |
Dispositivo | Mostra i numeri del dispositivo. |
Taglia/Spento | Mostra la dimensione del file in byte. |
Nodo | Mostra il numero di inode della directory o della directory padre. |
Nome | Mostra il nome del file system in cui si trova il processo. |
Elencare i processi
Innanzitutto è importante ottenere i processi in esecuzione e i rispettivi ID di processo. Linux fornisce una varietà di comandi per elencare i processi insieme ai loro attributi come PID, utente, directory, ecc.
Puoi usare i comandi come superiore
, ps
, htop
, pstree
per elencare i processi sul terminale.
Durante il tutorial, userò il superiore
comando per farlo. Il superiore
Il comando fornisce una vista dinamica in tempo reale di un sistema in esecuzione. Visualizza anche tutti i processi e i thread attualmente gestiti dal kernel Linux. Studiare il blocco indicato di seguito per verificare l'output del superiore
comando.
Sintassi:
sudo in alto
Produzione:
gaurav@ubuntu:~$sudo top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87:48.08 Contenuto Web 1173 mongodb 20 0 288536 6776 3428 S 5.9 0.2 2: 34.41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5,9 3,3 1:42.34 Contenuto Web 1 radice 20 0 225904 6824 4900 S 0,0 0,2 0:27.25 systemd 2 radice 20 0 0 0 0 S 0,0 0,0 0:00.05 kthreadd 4 radice 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 radice 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 radice 20 0 0 0 0 S 0.0 0.0 0:01.89 ksoftirqd/0 8 radice 20 0 0 0 0 I 0.0 0.0 0:22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0:03.13 migrazione/0
Nel blocco sopra, possiamo vedere tutte le informazioni relative al processo in un unico posto. Da qui possiamo trovare il PID
del processo di cui dobbiamo visualizzare i file aperti utilizzando il lsof
comando.
Ma se vuoi scoprire l'ID del processo solo di un particolare processo ed evitare altri processi indesiderati, usa il seguente comando.
Sintassi:
sudo top | grep [Nome_processo]
Esempio:
gaurav@ubuntu:~$ in alto | grep terminale 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0:53.63 gnome-terminale- 13819 gaurav 20 0 803336 19728 9160 S 1,0 0,5 0:53.66 gnome-terminale- 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0:53.67 gnome -terminale- gaurav@ubuntu:~$
Qui abbiamo specificamente visualizzato l'ID processo del processo che ha la stringa "terminale" nel nome del processo. Questo metodo è utile quando non si è a conoscenza del nome completo del processo o del PID.
Visualizzazione dei file aperti relativi a un processo utilizzando il PID
Nel blocco sopra, abbiamo imparato come ottenere le informazioni relative al processo con l'aiuto del comando top. Ora useremo il PID
corrispondente a qualsiasi processo sul sistema e provare a visualizzare l'elenco dei file aperti relativi a quel processo utilizzando il pulsante lsof
comando.
Dall'output sopra riportato, prendiamo il processo corrispondente al PID 1173 che è evidenziato. Useremo il lsof -p [PID]
comando per farlo.
Sintassi:
sudo lsof -p [PID]
Questo comando prende il PID del processo come input ed elenca tutti i file corrispondenti a questo PID.
Produzione:
gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: ATTENZIONE: impossibile stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Le informazioni di output potrebbero essere incomplete. COMANDO PID UTENTE FD TIPO DISPOSITIVO DIMENSIONE/OFF NOME NODO mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb txt REG 8,8 38379496 2885608 /usr/bin/mongod 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86_64-linux-gnu/libresolv-2.27.so mongod 1173 mongodb mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2 mongod 1173 mongod mem 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 /usr/lib/locale/locale-archive mongod 1173 mongodb mem REG 8,8 2030544 2621501 / lib/x86_64-linux-gnu/libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem REG 8,8 96616 2624649 /lib/ x86_64-linux-gnu/libgcc_s.so.1 mongod 1173 mongodb me m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 gaurav@ubuntu :~$
I file aperti per il processo con ID processo 1713 vengono visualizzati utilizzando il tasto lsof
comando.
Nota: Gli utenti di GNOME potrebbero riscontrare il seguente avviso. Puoi tranquillamente ignorarlo.
lsof: ATTENZIONE: impossibile stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Le informazioni di output potrebbero essere incomplete.
Elenco dei file aperti relativi a un processo utilizzando il nome del processo
Il lsof
Il comando fornisce anche un'opzione per elencare i file aperti utilizzando i nomi dei processi. I nomi devono essere forniti al comando come stringa di input. Vedere la sintassi di seguito per utilizzare questa opzione.
Sintassi:
sudo lsof -c [Nome processo]
Esempio:
sudo lsof -c mysql
Produzione:
gaurav@ubuntu:~$ sudo lsof -c mysql lsof: ATTENZIONE: impossibile stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Le informazioni di output potrebbero essere incomplete. COMANDO PID UTENTE FD TIPO DISPOSITIVO DIMENSIONE/OFF NOME NODO mysqld 1266 mysql cwd DIR 8,8 4096 3154135 /var/lib/mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 1266 mysql txt REG 8,89411691368 /sbin/mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 /[aio] mysqld 1266 mysql DEL REG 0,18 28126 /[ aio] mysqld 1266 mysql DEL REG 0,18 28125 /[aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mysqld 1266 mysql mem REG 8,8 47576 2624592 / lib/x86_64-linux-gnu/libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so
L'output sarà quello in cui viene utilizzato l'ID processo al posto del nome processo.
Elenco dei file aperti da connessioni di rete
In Linux, i file possono anche essere sotto forma di informazioni sulle connessioni di rete, sulle connessioni hardware, ecc. Possiamo usare lsof
comando per elencare i file aperti dalla connessione di rete. Utilizzare il seguente metodo.
sudo lsof -i
Produzione:
gaurav@ubuntu:~$ sudo lsof -i COMANDO PID UTENTE FD TIPO DIMENSIONE DISPOSITIVO/OFF NOME NODO systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domain systemd-r 969 systemd-resolve 13u IPv4 17358 0t0 TCP localhost: domain (LISTEN) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu:48090->_gateway:domain avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *:mdns avahi-dae 1028 avahi 13u IPv6 23811 0t0 UDP avahi-dae 1028 avahi 14u IPv4 23812 0t0 UDP *:58999 avahi-dae 1028 avahi 15u IPv6 23813 0t0 UDP *:37512 mongod 1173 mongodb 6u IPv4 28149 0t0 TCP localhost:27017 (ASCOLTO) mysqld 1266 IPv4 TCP99219u mysql (ASCOLTA) apache2 1283 root 4u IPv6 28140 0t0 TCP *:http (ASCOLTA) gaurav@ubuntu:~$
Qui possiamo vedere le informazioni sui file che sono aperti dalla connessione di rete usando il lsof -i
comando.
Conclusione
In questo semplice tutorial, abbiamo imparato come elencare i file aperti per un processo in Linux utilizzando vari metodi facili da usare. Per ulteriori usi del lsof
comando, vedi lsof
pagina man.