utilisation de la commande lsof

Creation: 20 avril 2015
Mise à jour: 23/10/2015
Version: 1.01
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2015 Jean-Louis BICQUELET-SALAÜN

Lsof ou comment identifier les fichiers ouverts

Il est facile de se souvenir que lsof correrspond à ls + of, avec ls pour list et of pour open files.

lsof est un utilitaire en ligne de commande qui est utilisé pour lister les informations sur les fichiers ouverts par les différents processus du système.

Utilisation de base de lsof

tous les fichiers ouverts par tous les processus

Par défaut lsof fournit la liste de tous les fichiers ouverts par tous les processus.

#lsof
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
Value of I :182          np:0
COMMAND        PID      USER   FD   TYPE             DEVICE           SIZE/OFF   NODE NAME
(unknown)        0      root  cwd   VDIR               10,4               4096      2 / (/dev/hd4)
init             1      root  cwd   VDIR               10,4               4096      2 / (/dev/hd4)
init             1      root    0u  VREG               10,4              30456    599 / (/dev/hd4)
syncd      1900544      root  cwd   VDIR               10,4               4096      2 / (/dev/hd4)
syncd      1900544      root    0r  VCHR                2,2                0t0    442 /dev/null
syncd      1900544      root    1w  VCHR                2,2                0t0    442 /dev/null
syncd      1900544      root    2w  VCHR                2,2                0t0    442 /dev/null
shlap64    1966182      root  cwd   VDIR               10,4               4096      2 / (/dev/hd4)
..

FD ou file descriptor

cwd Current Working Directory (répertoire courrant)
txt Fichier de texte
mem Memory mapped file
mmap Memory mapped device
un nombre l'actuel file descriptor. Le caractère qui suit se nombre représente le mode d'ouverture

Mode d'ouverture

r read
w write
u read and write.

Type

TYPE indique le type de fichier. Cela peut-être entre autre:

REG fichier régulier
DIR répertoire
FIFO First In First Out
CHR fichier spécial de caractères

processus utilisant un répertoire ou un fichier donné

On peut spécifier le nom d'un fichier ou d'un répertoire. lsof donnera tous les processus qui accèdent à ce fichier.

#lsof /var/log/syslog
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
Value of I :182          np:0
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
syslogd 2949284 root    5w  VREG  10,11   430135   27 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   11w  VREG  10,11        0    4 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   12w  VREG  10,11      152   37 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   14w  VREG  10,11    31310   36 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   15w  VREG  10,11    31569    7 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   16w  VREG  10,11    31569    8 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   17w  VREG  10,11   325657   29 /var/log/syslog (/dev/lv_syslog)
syslogd 2949284 root   18w  VREG  10,11   430262   28 /var/log/syslog (/dev/lv_syslog)

Lister tous les fichiers d'un répertoire

Dans le cas d'un répertoire on peut utiliser l'option (+D) qui fournit le nom exact des fichiers accédés.

#lsof +D  /var/log/syslog
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
Value of I :182          np:0
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
syslogd 2949284 root    5w  VREG  10,11   431186   27 /var/log/syslog/info.log
syslogd 2949284 root   11w  VREG  10,11        0    4 /var/log/syslog/emerg.log
syslogd 2949284 root   12w  VREG  10,11      152   37 /var/log/syslog/alert.log
syslogd 2949284 root   14w  VREG  10,11    31310   36 /var/log/syslog/crit.log
syslogd 2949284 root   15w  VREG  10,11    31569    7 /var/log/syslog/err.log
syslogd 2949284 root   16w  VREG  10,11    31569    8 /var/log/syslog/warning.log
syslogd 2949284 root   17w  VREG  10,11   326534   29 /var/log/syslog/notice.log
syslogd 2949284 root   18w  VREG  10,11   431313   28 /var/log/syslog/debug.log

lister tous les process qui occupent un filesystem

Meme si il est possible d'utiliser fuser -kxuc pour supprimer tous les processus qui occupent un filesysteme et l'empeche d'être démonté, il est toujours utile et même préferrable de vérifier les processus afin d'arrêter ceux-ci le plus proprement possible.

Pour cela on utilise lsof sur le point de montage.

 #lsof /home
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND        PID           USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
ksh        3015000     bicquelet  cwd   VDIR   10,8     4096 109522 /home (/dev/hd1)
ksh        3015000     bicquelet   63u  VREG   10,8    11100 109588 /home (/dev/hd1)
ksh        4718856     bicquelet  cwd   VDIR   10,8     4096 109522 /home (/dev/hd1)
ksh        4718856     bicquelet   63u  VREG   10,8    23326 109531 /home (/dev/hd1)
screen-4.  5177656     bicquelet  cwd   VDIR   10,8     4096 109522 /home (/dev/hd1)
sudo       5570708           root  cwd   VDIR   10,8     4096 102455 /home (/dev/hd1

L'arrêt des processus pourra alors se faire au cas par cas.

lister tous les processus d'un utilisateur

 #lsof -u bicqueletjl
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND      PID        USER   FD   TYPE             DEVICE  SIZE/OFF  NODE NAME
sshd     5963910 bicqueletjl  cwd   VDIR               10,4      4096     2 / (/dev/hd4)
sshd     5963910 bicqueletjl    0u  VCHR                2,2       0t0   207 /dev/null
sshd     5963910 bicqueletjl    1u  VCHR                2,2       0t0   207 /dev/null
sshd     5963910 bicqueletjl    2w  VMPC                4,0       0t0    90 /dev/console/0
sshd     5963910 bicqueletjl    3r  VREG               10,5      6242 62327 /usr (/dev/hd2)
sshd     5963910 bicqueletjl    4u  unix 0xf1000e00059e9008       0t0       ->(none)
sshd     5963910 bicqueletjl    5u  IPv4 0xf1000e0003f6cbb8 0t4269405   TCP serveur01:ssh->station98979.domaine.fr:53138 (ESTABLISHED)
sshd     5963910 bicqueletjl    6u  unix 0xf1000e00053d2c08  0t165333       ->0xf1000e00057c3408
sshd     5963910 bicqueletjl    7u  unix 0xf1000e0000f71008    0t1469       ->(none)
sshd     5963910 bicqueletjl    8r  FIFO 0xf1000a01c05ff910         0
sshd     5963910 bicqueletjl    9w  FIFO 0xf1000a01c05ff910         0
sshd     5963910 bicqueletjl   10r  VREG               10,5      6443 62567 /usr (/dev/hd2)
sshd     5963910 bicqueletjl   11w  FIFO 0xf1000a01c05f82b0         0
sshd     5963910 bicqueletjl   12u  VCHR              43,28 0t1952219   225 /dev/ptc/28
sshd     5963910 bicqueletjl   14u  VCHR              43,28 0t1952219   225 /dev/ptc/28
sshd     5963910 bicqueletjl   15u  VCHR              43,28 0t1952219   225 /dev/ptc/28

Il est aussi possible d'afficher tous les processus sauf celui d'un utilisateur. On utilise alors le caractère ^.

#lsof -u ^bicqueletjl
ksh       37814456           root  cwd   VDIR               10,4              28672  26217 / (/dev/hd4)
ksh       37814456           root    0r  VCHR                2,2                0t0    207 /dev/null
ksh       37814456           root    1w  VREG               51,3              13218 323732 /etatconfig/aix (/dev/confvg)
ksh       37814456           root    2w  VREG               51,3              13218 323732 /etatconfig/aix (/dev/confvg)
ksh       37814456           root   10r  VREG               10,5               5875  62520 /usr (/dev/hd2)
ksh       37814456           root   62r  VREG               51,3               3012 281858 /etatconfig/aix (/dev/confvg)
vi        38142116           root  cwd   VDIR               51,1               4096 508223 /ins (/dev/insvg)
vi        38142116           root    0u  VCHR              44,11           0t785987    270 /dev/pts/11
vi        38142116           root    1u  VCHR              44,11           0t785987    270 /dev/pts/11
vi        38142116           root    2u  VCHR              44,11           0t785987    270 /dev/pts/11
vi        38142116           root    3u  VREG               10,6             557056  32930 /var (/dev/hd9var)
vi        38142116           root    4r  VREG               10,4                565  26383 / (/dev/hd4)
vi        38142116           root    5r  VREG               10,5              19054  62326 /usr (/dev/hd2)
vi        38142116           root    6u  VREG               10,6             327680  32931 /var (/dev/hd9var)
sudo      38338762           root  cwd   VDIR               10,8              12288  94228 /home (/dev/hd1)
sudo      38338762           root    0u  VCHR              44,36             0t3071    443 /dev/pts/36
sudo      38338762           root    1u  VCHR              44,36             0t3071    443 /dev/pts/36
sudo      38338762           root    2u  VCHR              44,36             0t3071    443 /dev/pts/36
sudo      38338762           root    3u  unix 0xf1000e0003c4d808                0t0        ->(none)
sudo      38338762           root    5u  unix 0xf1000e0003f9d408             0t2505        ->0xf1000e0004072808
sudo      38338762           root    6u  unix 0xf1000e000405c808                0t0        ->(none)
sudo      38338762           root    7r  FIFO 0xf1000a023017b610                  0
sudo      38338762           root    8r  VREG               10,5               6242  62327 /usr (/dev/hd2)
sudo      38338762           root    9w  FIFO 0xf1000a023017b610                  0
ssh       38600946           root  cwd   VDIR               10,8               4096 109522 /home (/dev/hd1)
ssh       38600946           root    0u  VCHR              44,27          0t3356089    433 /dev/pts/27
ssh       38600946           root    1u  VCHR              44,27          0t3356089    433 /dev/pts/27
ssh       38600946           root    2u  VCHR              44,27          0t3356089    433 /dev/pts/27
ssh       38600946           root    3r  VREG               10,5               6242  62327 /usr (/dev/hd2)
ssh       38600946           root    4u  unix 0xf1000e0001ebd008                0t0        ->(none)
ssh       38600946           root    5u  IPv4 0xf1000e0004dd9bb8           0t253490    TCP serveur01:35518->serveur56.domaine.fr:ssh (ESTABLISHED)
ssh       38600946           root    6u  VCHR              44,27          0t3356089    433 /dev/pts/27
ssh       38600946           root    7u  VCHR              44,27          0t3356089    433 /dev/pts/27
ssh       38600946           root    8u  VCHR              44,27          0t3356089    433 /dev/pts/27

lister tous les fichiers ouverts par un processus donné

ist all open files by a specific process

Vous pouvez lister tous les fichiers ouverts par un processus donné en utilisant l'option-p. C'est utile pour obtenir plus d'informations sur ce processus et comprendre celui-ci.

 #ps -ef |grep ksh |grep bicqueletjl
bicquele 27197546 37748900   0   May 13 pts/12  0:00 -ksh
bicquele 14549290 34013366   0   May 12  pts/0  0:00 -ksh
bicquele 29819310  5963910   0   May 12 pts/28  0:00 -ksh
[serveur01:root]/var/log #lsof -p 27197546
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND      PID        USER   FD   TYPE DEVICE  SIZE/OFF  NODE NAME
ksh     27197546 bicqueletjl  cwd   VDIR   10,8      4096 41213 /home (/dev/hd1)
ksh     27197546 bicqueletjl    0u  VCHR  44,12 0t4671639   281 /dev/pts/12
ksh     27197546 bicqueletjl    1u  VCHR  44,12 0t4671639   281 /dev/pts/12
ksh     27197546 bicqueletjl    2u  VCHR  44,12 0t4671639   281 /dev/pts/12
ksh     27197546 bicqueletjl   10r  VREG   10,5      5875 62520 /usr (/dev/hd2)
ksh     27197546 bicqueletjl   61u  VREG   10,7         0   565 /tmp (/dev/hd3)
ksh     27197546 bicqueletjl   63u  VREG   10,8     33136 37399 /home (/dev/hd1)

lister toutes les connections du réseau

L'option pour lister les connection réseau est l'option -i.

 #lsof -i | head -n 10
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
 In while loop:256
Value of I :124          np:256
COMMAND        PID      USER   FD   TYPE             DEVICE    SIZE/OFF NODE NAME
sshd           448 pbp1procs    5u  IPv4 0xf1000e0003e073b8  0t30657321  TCP serveur03->domaine.fr:35692 (ESTABLISHED)
sshd        459036 pbp1procs    5u  IPv4 0xf1000e00001d8bb8  0x41e674d9  TCP serveur03->domaine.fr:43915 (ESTABLISHED)
sshd        655724      root    5u  IPv4 0xf1000e0003e0c3b8  0x526fb939  TCP serveur03->domaine.fr:37403 (ESTABLISHED)
sshd       1310994      root    5u  IPv4 0xf1000e0003daabb8    0t453401  TCP serveur03->domaine.fr:59980 (ESTABLISHED)
clcomd     2031796      root    6u  IPv6 0xf1000e0003d9d3b8         0t0  TCP *:clcomd_caa (LISTEN)
sshd       2228612      root    5u  IPv4 0xf1000e00002423b8   0t6153465  TCP serveur03->domaine.fr:35868 (ESTABLISHED)
nimsh      2359432      root    4u  IPv6 0xf1000e0000663bb8         0t0  TCP *:nimsh (LISTEN)

On peut aussi utiliser les optiob -i4 et -i6 pour lister les connection uniquement IPV4 et IPV6.

lister les protocoles tcp ou udp

#lsof -i tcp; lsof -i udp;
sshd      36962502    madariagaan    5u  IPv4 0xf1000e0000cc8bb8  0t2219597  TCP sxpnim01:ssh->dk275851.fr.intranet:55753 (ESTABLISHED)
sshd      37748900    bicqueletjl    5u  IPv4 0xf1000e0000562bb8  0t7510429  TCP sxpnim01:ssh->dk298979.fr.intranet:51575 (ESTABLISHED)
sshd      38142172           root    5u  IPv4 0xf1000e0003827bb8    0t65753  TCP sxpnim01:ssh->swpafraepcx52.fr.intranet:61960 (ESTABLISHED)
ssh       38600946           root    5u  IPv4 0xf1000e0004dd9bb8   0t267794  TCP sxpnim01:35518->sxpora56.intranet:ssh (ESTABLISHED)
lsof: WARNING: /root/.lsof_sxpnim01 was updated.
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND       PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
portmap   1311160   root    4u  IPv6 0xf1000e00037b0400      0t0  UDP *:sunrpc
portmap   1311160   root    5u  IPv6 0xf1000e00037b0600      0t0  UDP *:32775
aixmibd   1835438   root   16u  IPv6 0xf1000e00040a7400      0t0  UDP *:58088
inetd     2031852   root    5u  IPv4 0xf1000e000052aa00      0t0  UDP *:bootps
inetd     2031852   root    6u  IPv4 0xf1000e00000a1a00      0t0  UDP *:32793

lister toutes les connections réseau associé à un processus donné

On récupère le pid du processus et on utilise sof -i -a -p pour trouver la connection.

ps -ef |grep ssh | grep bicq
bicquele  5963910 25231748   0   May 12      -  0:14 sshd: bicqueletjl

ts/28 root 32768012 4325698 0 May 13 - 0:12 sshd: bicqueletjl [priv] bicquele 34013366 10158466 0 May 12 - 0:28 sshd: bicqueletjl

ts/0 bicquele 37748900 32768012 0 May 13 - 0:13 sshd: bicqueletjl

ts/12 root 10158466 4325698 0 May 12 - 0:08 sshd: bicqueletjl [priv] root 25231748 4325698 0 May 12 - 0:09 sshd: bicqueletjl [priv] #lsof -i -a -p 34013366 lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 34013366 bicqueletjl 5u IPv4 0xf1000e0003d0bbb8 0xbc51f35 TCP serveur:ssh->station98979.domaine.fr:58832 (ESTABLISHED)

Sur le terminal pts/0 je suis connecté en ssh protocole IPV4 à partir d'une station.

On peut aussi utiliser sof -i -a -c ssh qui liste les processus commençant par ssh

#lsof -i -a -c ssh
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND      PID           USER   FD   TYPE             DEVICE   SIZE/OFF NODE NAME
sshd     2949490           root    5u  IPv4 0xf1000e0003e5f3b8   0t893633  TCP serveur01:ssh->station84027.domaine.fr:59540 (ESTABLISHED)
sshd     4325698           root    3u  IPv4 0xf1000e0003c73bb8        0t0  TCP *:ssh (LISTEN)
sshd     4325698           root    4u  IPv6 0xf1000e0003c733b8        0t0  TCP *:ssh (LISTEN)
sshd     4522262           root    5u  IPv4 0xf1000e000287b3b8 0t25444809  TCP serveur01:ssh->station75851.domaine.fr:58418 (ESTABLISHED)
sshd     5505406    doejohn     5u  IPv4 0xf1000e00016763b8 0t18280013  TCP serveur01:ssh->station75851.domaine.fr:56040 (ESTABLISHED)
sshd     5963910    bicqueletjl    5u  IPv4 0xf1000e0003f6cbb8  0t4281501  TCP serveur01:ssh->station98979.domaine.fr:53138 (ESTABLISHED)
ssh      6488448           root    5u  IPv4 0xf1000e0002af13b8  0t4529794  TCP serveur01:52825->sxrtg212.intranet:ssh (ESTABLISHED)
sshd     6684886      sharonsto    5u  IPv4 0xf1000e0004e933b8  0t3310337  TCP serveur01:ssh->station76486.domaine.fr:59096 (ESTABLISHED)
sshd     6684886      sharonsto   12u  IPv4 0xf1000e00001483b8        0t0  TCP loopback:6010 (LISTEN)
sshd     6684886      sharonsto   13u  IPv6 0xf1000e0002fbc3b8        0t0  TCP ip6-localhost:6010 (LISTEN)
...

lister toutes les connections réseau qui utilise un port réseau donné

On utilise l'option -i.

#lsof -i :22
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND      PID           USER   FD   TYPE             DEVICE   SIZE/OFF NODE NAME
sshd     2949490           root    5u  IPv4 0xf1000e0003e5f3b8   0t892465  TCP serveur01:ssh->station84027.domaine.fr:59540 (ESTABLISHED)
sshd     4325698           root    3u  IPv4 0xf1000e0003c73bb8        0t0  TCP *:ssh (LISTEN)
sshd     4325698           root    4u  IPv6 0xf1000e0003c733b8        0t0  TCP *:ssh (LISTEN)
sshd     4522262           root    5u  IPv4 0xf1000e000287b3b8 0t25444809  TCP serveur01:ssh->station75851.domaine.fr:58418 (ESTABLISHED)
sshd     5505406    doejohn     5u  IPv4 0xf1000e00016763b8 0t18275981  TCP serveur01:ssh->station75851.domaine.fr:56040 (ESTABLISHED)
sshd     5963910    bicqueletjl    5u  IPv4 0xf1000e0003f6cbb8  0t4281501  TCP serveur01:ssh->station98979.domaine.fr:53138 (ESTABLISHED)
ssh      6488448           root    5u  IPv4 0xf1000e0002af13b8  0t4529410  TCP serveur01:52825->station212.domaine.fr:ssh (ESTABLISHED)
#lsof -i :22 -t
34930764
36438100
36962502
37748900
38142172
38600946
...

Il est possible de préciser aussi le protocole

#lsof -i TCP:22

ou une plage de ports

lsof -i TCP:1-1024

lister les sockets

#lsof -U

connaitre les connections actives vers un ordinateur

 #lsof -i @serveur02
lsof: WARNING: compiled for AIX version 6.1.3.0; this is 7.1.0.0.
COMMAND      PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ssh     17629602 root    5u  IPv4 0xf1000e00037ea3b8 0t951034  TCP serveur01:39938->serveur02:ssh (ESTABLISHED)

Autre exemple:

#lsof -i @serveur02b
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
 In while loop:256
 In while loop:256
Value of I :36   np:512
COMMAND        PID    USER   FD   TYPE             DEVICE   SIZE/OFF NODE NAME
sldfs_rre  3146116 sysload    3u  IPv4 0xf1000e0000c04bb8        0t0  TCP serveur02b:9502 (LISTEN)
zabbix_ag  4260050  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
xntpd      4456616    root    6u  IPv4 0xf1000e0000160600        0t0  UDP serveur02b:ntp
secldapcl  5046438    root    5u  IPv4 0xf1000e0003d243b8 0x134b2f0f  TCP serveur02b:32776->serveurldap01:ldap (ESTABLISHED)
secldapcl  5046438    root    6u  IPv4 0xf1000e0003d2f3b8   0t590863  TCP serveur02b:32777->serveurldap02:domaine.fr:ldap (ESTABLISHED)
secldapcl  5046438    root    7u  IPv4 0xf1000e0003d3a3b8   0t590766  TCP serveur02b:32778->serveurldap03:domaine.fr:ldap (ESTABLISHED)
zabbix_ag  5374160  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
zabbix_ag  6684804  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
zabbix_ag  6750380  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
zabbix_ag  7012524  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
zabbix_ag  7798940  zabbix    4u  IPv4 0xf1000e0000538bb8        0t0  TCP serveur02b:10050 (LISTEN)
heart     12517550    root    3u  IPv4 0xf1000e00035ff400        0t0  UDP serveur02b:ddi-udp-1
mmfsd64   16056420    root   32u  IPv4 0xf1000e0003d52bb8        0t0  TCP serveur02b:1191->serveur02a:37994 (ESTABLISHED)
sldsm_evn 25690564 sysload    7u  IPv4 0xf1000e0000cb73b8        0t0  TCP serveur02b:49223 (LISTEN)
lsof: WARNING: /root/.lsof_serveur02b was updated.

utilisation plus élaborée de lsof

suppression de tous les processus d'un utilisateur

L'option -t permet de récupérer avec @b-lsof) uniquement les numéros de processus. On peut réaliser des combinaisons assez efficaces. Par exemple supprimer tous les processus d'un utilisateur.

# kill -9 `lsof -t -u bicqueletjl`

compter le nombre de processus ouverts sur un port donné

Il peut être utile de compter le nombre de connection ouverte à un moment donné afin d'adapter les paramêtres du système.

Voici une manière de faire.

#lsof -i -a -c ssh |wc -l
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.1.0.0.
     138