lsof signifie List Open Files.
Il est facile de se souvenir de la commande lsof si vous la considérez comme "ls + of", où ls représente la liste et of représente les fichiers ouverts.
Il s'agit d'un utilitaire de ligne de commande utilisé pour répertorier les informations sur les fichiers ouverts par divers processus. Sous Unix, tout est un fichier (tubes, sockets, répertoires, périphériques, etc.). Ainsi, en utilisant lsof, vous pouvez obtenir des informations sur tous les fichiers ouverts.
1. Présentation de lsof
Taper simplement lsof fournira une liste de tous les fichiers ouverts appartenant à tous les processus actifs.
# 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 ...
Par défaut Un fichier par ligne est affiché. La plupart des colonnes sont explicites. Nous expliquerons les détails de quelques colonnes cryptées (FD et TYPE).
FD – Représente le descripteur de fichier. Certaines des valeurs des FD sont,
- cwd – Répertoire de travail actuel
- txt - Fichier texte
- mem - Fichier mappé en mémoire
- mmap – Périphérique mappé en mémoire
- NUMBER – Représente le descripteur de fichier réel. Le caractère après le nombre, c'est-à-dire '1u', représente le mode dans lequel le fichier est ouvert. r pour lire, w pour écrire, u pour lire et écrire.
TYPE – Spécifie le type du fichier. Certaines des valeurs de TYPE sont,
- REG – Fichier normal
- DIR – Répertoire
- FIFO – Premier entré, premier sorti
- CHR - Fichier spécial caractère
Pour une liste complète de FD &TYPE, reportez-vous à man lsof.
2. Lister les processus qui ont ouvert un fichier spécifique
Vous pouvez lister uniquement les processus qui ont ouvert un fichier spécifique, en fournissant le nom du fichier comme arguments.
# 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. Lister les fichiers ouverts sous un répertoire
Vous pouvez lister les processus qui ont ouvert des fichiers sous un répertoire spécifié en utilisant l'option '+D'. +D récursera également les sous-répertoires. Si vous ne voulez pas que lsof se reproduise, utilisez l'option '+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. Répertorier les fichiers ouverts en fonction des noms de processus commençant par
Vous pouvez lister les fichiers ouverts par des noms de processus commençant par une chaîne, en utilisant l'option '-c'. -c suivi du nom du processus listera les fichiers ouverts par le processus en commençant par ce nom de processus. Vous pouvez donner plusieurs commutateurs -c sur une seule ligne de commande.
# 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. Répertorier les processus à l'aide d'un point de montage
Parfois, lorsque nous essayons de démonter un répertoire, le système indique l'erreur "Périphérique ou ressource occupée". Nous devons donc découvrir quels sont tous les processus utilisant le point de montage et tuer ces processus pour démonter le répertoire. En utilisant lsof, nous pouvons trouver ces processus.
# lsof /home
Ce qui suit fonctionnera également.
# lsof +D /home/
6. Lister les fichiers ouverts par un utilisateur spécifique
Pour trouver la liste des fichiers ouverts par un utilisateur spécifique, utilisez l'option "-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
Parfois, vous voudrez peut-être répertorier les fichiers ouverts par tous les utilisateurs, attendez-vous à 1 ou 2. Dans ce cas, vous pouvez utiliser le '^' pour exclure uniquement l'utilisateur particulier comme suit
# 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 /
La commande ci-dessus répertorie tous les fichiers ouverts par tous les utilisateurs, attendez-vous à l'utilisateur "lakshmanan".
7. Lister tous les fichiers ouverts par un processus spécifique
Vous pouvez lister tous les fichiers ouverts par un processus spécifique en utilisant l'option '-p'. Il sera parfois utile d'obtenir plus d'informations sur un processus spécifique.
# 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. Tue tous les processus appartenant à un utilisateur particulier
Lorsque vous souhaitez tuer tous les processus dont les fichiers sont ouverts par un utilisateur spécifique, vous pouvez utiliser l'option '-t' pour répertorier uniquement l'ID de processus du processus et le transmettre à kill comme suit
# kill -9 `lsof -t -u lakshmanan`
La commande ci-dessus tuera tous les processus appartenant à l'utilisateur 'lakshmanan', qui a ouvert des fichiers.
De même, vous pouvez également utiliser '-t' de plusieurs façons. Par exemple, pour lister l'ID de processus d'un processus qui a ouvert /var/log/syslog peut être fait par
# lsof -t /var/log/syslog 489
En parlant de tuer, saviez-vous qu'il existe 4 façons de tuer un processus ?
9. Combinez plus d'options de liste en utilisant OR/AND
Par défaut, lorsque vous utilisez plus d'une option de liste dans lsof, elles seront ORed. Par exemple,
# 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 ...
La commande ci-dessus utilise deux options de liste, "-u" et "-c". Ainsi, la commande listera le processus appartenant à l'utilisateur "lakshmanan" ainsi que le nom du processus commençant par "init".
Mais lorsque vous souhaitez répertorier un processus appartenant à l'utilisateur "lakshmanan" et que le nom du processus commence par "init", vous pouvez utiliser l'option "-a".
# lsof -u lakshmanan -c init -a
La commande ci-dessus ne produira rien, car il n'y a pas de processus nommé "init" appartenant à l'utilisateur "lakshmanan".
10. Exécuter lsof en mode répétition
lsof prend également en charge le mode Répétition. Il listera d'abord les fichiers en fonction des paramètres donnés, et retardera les secondes spécifiées, puis répertoriera à nouveau les fichiers en fonction des paramètres donnés. Il peut être interrompu par un signal.
Le mode de répétition peut être activé en utilisant '-r' ou '+r'. Si "+r" est utilisé, le mode de répétition se terminera lorsqu'aucun fichier ouvert n'est trouvé. '-r' continuera à lister, retarder, lister jusqu'à ce qu'une interruption soit donnée, que les fichiers soient ouverts ou non.
Chaque sortie de cycle sera séparée en utilisant '======='. Vous spécifiez également le délai comme '-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 =======
Dans la sortie ci-dessus, pendant les 5 premières secondes, il n'y a pas de sortie. Après cela, un script nommé "inita.sh" est lancé et répertorie la sortie.
Trouver une connexion réseau
Les connexions réseau sont également des fichiers. Nous pouvons donc trouver des informations à leur sujet en utilisant lsof.
11. Lister toutes les connexions réseau
Vous pouvez lister toutes les connexions réseau ouvertes en utilisant l'option "-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)
Vous pouvez également utiliser '-i4' ou '-i6' pour ne lister que 'IPV4' ou 'IPV6' respectivement.
12. Répertorier tous les fichiers réseau utilisés par un processus spécifique
Vous pouvez répertorier tous les fichiers réseau utilisés par un processus comme suit
# lsof -i -a -p 234
Vous pouvez également utiliser les éléments suivants
# lsof -i -a -c ssh
La commande ci-dessus listera les fichiers réseau ouverts par les processus commençant par ssh.
13. Lister les processus qui écoutent sur un port particulier
Vous pouvez lister les processus qui écoutent sur un port particulier en utilisant '-i' avec ':' comme suit
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14. Lister toutes les connexions TCP ou UDP
Vous pouvez lister toutes les connexions TCP ou UDP en spécifiant le protocole à l'aide de '-i'.
# lsof -i tcp; lsof -i udp;
15. Répertorier tous les fichiers du système de fichiers réseau ( NFS )
Vous pouvez lister tous les fichiers NFS en utilisant l'option '-N'. La commande lsof suivante listera tous les fichiers NFS utilisés par l'utilisateur "lakshmanan".
# lsof -N -u lakshmanan -a