Lsof
| Fiche express | |
|---|---|
| Domaine | Fichiers ouverts, processus, réseau |
| Commande | lsof
|
| Contexte | Paquet lsof — croise fichiers/sockets ouverts avec PID, utilisateur ou port
|
| Voir aussi | Ps (identifier le PID), Top (charge en temps réel) |
lsof (« list open files ») liste tous les fichiers ouverts par les processus — au sens large, puisque sous Linux une socket réseau ou un point de montage sont aussi des « fichiers ». Très utile pour retrouver quel processus tient un port, un utilisateur ou un fichier supprimé mais toujours ouvert.
Fichiers ouverts par processus
lsof -p 1456 # tous les fichiers ouverts par le PID 1456
lsof -p 1234,12345 # plusieurs PID à la fois
lsof -p 1234,12345 -u 500,www-data # combiné à un filtre utilisateur (UID ou nom)
Fichiers ouverts par utilisateur
lsof -u www-data # tous les fichiers ouverts par cet utilisateur
lsof -i -u www-data # ... limités aux connexions réseau
lsof -i -u^root # exclure un utilisateur (ici root) avec le préfixe ^
Connexions réseau ouvertes par port ou protocole
lsof -i # toutes les connexions réseau en cours
lsof -i -p 1234 # connexions réseau du seul PID 1234
lsof -i 4 # IPv4 uniquement
lsof -i 6 # IPv6 uniquement
lsof -i TCP:22 # qui écoute/est connecté sur le port 22
lsof -i TCP:1-1024 # plage de ports (ports privilégiés)
lsof -ni tcp # -n : pas de résolution DNS, -i : réseau (plus rapide)
lsof -ni tcp:50002 # port TCP précis, sans résolution DNS
lsof -ni 'udp@192.168.66.66:123' # port UDP sur une IP distante précise (ex. NTP)
Tuer un processus via son port ou son utilisateur
Combiné à -t (n'affiche que les PID, un par ligne), lsof se chaîne directement avec kill :
kill $(lsof -t -i:1390) # tuer le(s) processus qui écoute(nt) sur le port 1390
kill -9 $(lsof -t -u www-data) # tuer toute l'activité d'un utilisateur donné
Repérer les fichiers en cours d'écriture
La colonne FD de la sortie standard affiche un suffixe w pour un descripteur ouvert en écriture — utile pour repérer une activité disque suspecte :
lsof | grep -E '[0-9]+w' lsof -u oracle
Récupérer l'espace disque d'un fichier supprimé mais toujours ouvert
Un fichier supprimé (rm) dont un processus garde le descripteur ouvert continue d'occuper l'espace disque tant que ce processus tourne (visible via df qui ne correspond plus à du). Plusieurs façons de traiter le cas :
lsof +L1 # liste les fichiers ouverts dont le nombre de liens est < 1 (supprimés)
fuser -v /point/de/montage # identifie les processus qui tiennent des fichiers sur ce point de montage
truncate -s 0 /proc/1234/fd/56 # vide le fichier via son descripteur sans arrêter le processus (1234=PID, 56=FD)
Alternative avec gdb quand truncate n'est pas suffisant (le processus garde le FD ouvert mais on force sa fermeture, ce qui libère réellement l'espace) :
gdb -p 1234
(gdb) p close(56)
$1 = 0
(gdb) quit
⚠️ Fermer un descripteur en cours d'utilisation avec gdb est intrusif : à réserver aux cas où redémarrer proprement le processus n'est pas possible.