web-dev-qa-db-fra.com

Comment en savoir plus sur les fichiers socket dans / proc / fd?

En regardant dans/proc/$ mypid/fd /, je vois ces fichiers

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

Parce que j'ai accès au code, je sais que ces sockets sont liées à TCP (l'une est une connexion au port 5672 sur une machine, une autre est une connexion au port 3306 sur une autre machine) , mais je veux savoir quelle socket est liée à quelle connexion. Comment faire?

Plus généralement, comment demander au système d'exploitation ce qu'il y a à l'autre extrémité du socket?

42
benhsu

Commande lsof

Une bonne option pourrait être lsof. Comme man lsof indique qu'il est pratique d'obtenir des informations sur open files such as Internet sockets or Unix Domain sockets.


En l'utilisant

Dans un premier temps, obtenez un aperçu de /proc/$PID/fd/ et les numéros de socket répertoriés.
Par exemple, socket:[14240] pourrait vous intéresser.

Utilisez ensuite lsof -i -a -p $PID pour imprimer une liste de tous les fichiers réseau $PID les usages.

  • -i produit une liste de fichiers réseau appartenant à un utilisateur ou à un processus

  • -a combine logiquement les paramètres donnés par AND

  • -p $PID sélectionne uniquement les informations sur votre processus

Une sortie typique pour mon navigateur fonctionnant avec un PID de 2543 pourrait être:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

et des lignes plus similaires.

Génial! Examinons maintenant de plus près la colonne DEVICE. Il correspond à notre socket précédemment répertorié de /proc/$PID/fd/!
Et grâce à la section NAME, nous pouvons dire quelle est l'autre extrémité de notre socket.

Dans une exécution réelle, vous pouvez obtenir une bonne quantité de sortie, mais simplement filtrer ou grep pour votre socket d'intérêt.

Je suis sûr que l'on pourrait combiner toutes les commandes, mais cela devrait suffire pour vous aider à démarrer.

50
pidi