La commande lsof répertorie les fichiers ouverts, les sockets et les canaux. Vous pouvez utiliser la commande lsof pour voir quels fichiers sont maintenus ouverts (tels que des bibliothèques ou des fichiers journaux) et quels ports les démons écoutent. Vous pouvez rechercher des fichiers ouverts à l'aide de la commande lsof. lsof doit être exécuté en tant que superutilisateur (root) pour voir tous les fichiers ouverts. Lorsqu'il est utilisé sans arguments/options, lsof répertorie tous les fichiers ouverts pour les processus actifs en cours.
# 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 ..........
Comprendre la sortie de la commande "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
Rechercher des fichiers ouverts sous un point de montage
Les fichiers ouverts dans un répertoire particulier peuvent être trouvés en utilisant lsof. Par exemple, ouvrez un fichier texte (ne le fermez pas - gardez-le ouvert) sous un répertoire pour le modifier à l'aide de vi et vérifiez la sortie lsof sous ce répertoire dans une autre session.
# cd /test # vi a.txt
Dans une autre session, vérifiez la sortie de lsof sous ce répertoire :
# 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
Cela peut également être utilisé pour démonter le point de montage occupé. Les processus qui maintiennent le point de montage occupé peuvent être trouvés en utilisant lsof.
Rechercher des informations sur un processus particulier
Pour plus d'informations sur un processus particulier, utilisez l'option -p pour lsof :
# lsof -p 8797
Afficher les adresses d'écoute
Les démons peuvent soit se lier à l'adresse IPv4 globale 0.0.0.0, soit à des adresses spécifiques, telles que 127.0.0.1 (localhost). Un démon lié à l'adresse localhost ne sera accessible qu'à partir du système lui-même. Utilisez les options -i et -nP pour lsof pour afficher les ports d'écoute sans rechercher les noms d'hôte et les services. Par exemple, l'exemple suivant montre le démon Apache httpd s'exécutant sur localhost sur le port non standard 7777. Les autres systèmes ne pourront pas se connecter à ces processus httpd :bon pour la sécurité, mauvais pour la connectivité à distance.
Exemple :
# 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)
Exemple :
En revanche, le processus sshd OpenSSH suivant acceptera les connexions d'autres systèmes, car il est lié à l'adresse 0.0.0.0, comme indiqué par le * précédant le numéro de port.
# lsof -i -P | grep sshd sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)
Certaines applications écoutent sur de nombreux ports différents, comme le démon nommé BIND (Berkeley Internet Name Daemon), version 9.
Exemple :
# 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)
Rechercher les fichiers ouverts par un processus
Un processus peut ne pas fonctionner pour d'autres raisons, telles qu'un pare-feu, un contrôle de service d'accès comme tcp_wrappers ou une autre mauvaise configuration. Utilisez ping, telnet ou nmap pour vérifier à partir d'un système distant si quelque chose d'autre peut bloquer la requête, ou exécutez tcpdump pour voir si les connexions quittent la source ou arrivent au système cible.
Exemple
Pour voir quels fichiers sont ouverts par les processus dont le nom commence par "t" (telnetd...) et bash. Et pour voir quels fichiers sont ouverts par init utilisez les commandes suivantes :
# lsof -c t # lsof -c bash # lsof -c init
Exemple
Pour voir quels fichiers sont ouverts par les processus dont le nom commence par "testuser", mais exclure ceux dont le propriétaire est l'utilisateur "tom", utilisez la commande suivante :
# lsof -c testuser -u ^tom
Rechercher les processus ouverts par les utilisateurs
Pour voir quels processus sont ouverts par les utilisateurs myuser et tom, utilisez la commande suivante :
# lsof -u myuser,tom
Rechercher le port utilisé par le processus
Pour voir quels processus utilisent un port particulier, utilisez la commande suivante :
# lsof -i TCP:389
Comment trouver le nombre de fichiers ouverts pour un nom de processus et un pid de processus triés par nombre de fichiers ouverts ?
Cela peut être intéressant lorsque l'erreur "trop de fichiers ouverts" apparaît. Utilisez le script ci-dessous qui utilise la commande lsof :
# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Rechercher des processus à l'aide de descripteurs de fichiers max
Les limites des descripteurs de fichiers peuvent être définies à l'aide de la commande suivante pour un shell :
# ulimit -n 65536
Utilisez la commande "lsof" pour trouver ce qui utilise les descripteurs de fichiers sur le système.
# 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
Cela listera tous les processus et le nombre correspondant de fichiers ouverts par eux. Vous pouvez choisir les processus qui ont le plus grand nombre de fichiers ouverts et voir quels sont-ils.