Existe-t-il un moyen d'identifier le PID (ou cgroup) d'une socket sans itérer à travers tous les process dans / proc /

J'ai besoin d'identifier le cgroup d'un process donné le socket. Plus précisément, j'ai un process sur la même machine qui appelle mon process en utilisant tcp, et j'ai besoin d'identifier le process ou son groupe de contrôle. La condition tcp est parce que je simule une API tierce. J'ai besoin de returnner des données différentes selon le process qui m'appelle. Une solution consiste à déterminer le socket en utilisant / proc / net / tcp, à partir de laquelle je peux get l'inode pour le socket, puis itérer sur / proc / * / fd pour find cet inode répertorié. Existe-t-il un moyen direct de mapper un inode (je suppose un sockfs) à son PID sans cette itération?

En général, pour find ce qui se trouve à l'autre bout d'une socket, vous devez parcourir /proc . Cela peut bien sûr signifier de laisser un outil existant tel que netstat , lsof ou ss faire pour vous.

La raison en est qu'une socket peut être ouverte par différents process. Une fois qu'un process a ouvert un socket, celui-ci peut basculer et les enfants peuvent changer leurs privilèges et passer à des namespaces différents. Il est également possible de transmettre des descripteurs de files d'un process à un process non lié, en utilisant des données ancillaires sur un socket Unix. Ainsi, les process arbitraires peuvent avoir la même socket ouverte. Il n'y a pas de «PID d'un socket», seulement «les PID d'un socket».

Bien que cela ne prouve pas qu'il n'y a aucun moyen d'énumérer les PID donnés au socket, il serait très difficile de concevoir une telle interface, surtout si l'on considère que les users non-root ne savent pas quand les files sont ouverts par les process fonctionnant comme un user différent. L'access via /proc impose la security via les permissions, et je ne suis pas au courant d'aucune autre interface pour get les mêmes données. Aussi, fuser , lsof , netstat et ss tous énumèrent /proc ; S'il y avait une autre interface, je m'attendrais à ce que quelqu'un l'utilise. Je suis donc presque certain qu'il n'y a pas d'autre moyen.

si vous connaissez le numéro de port tcp, vous pouvez utiliser cette command dans votre terminal:

$ lsof | grep TCP | grep your_port_number

Par exemple: lsof | grep TCP | grep 1234