Vous pouvez écrire un programme pour surveiller / proc / net / tcp, dont la sortie ressemble à ceci:
obi-wan ~ # cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847458 1 e6060560 300 0 0 2 -1
1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847477 1 f2e64da0 300 0 0 2 -1
2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7109 1 f2e65ac0 300 0 0 2 -1
3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 4864457 1 d2726540 300 0 0 2 -1
4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847462 1 e60609c0 300 0 0 2 -1
5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000 0 0 4982752 3 f2e64940 55 4 0 2 -1
6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000 1000 0 2130283 1 d59cce40 21 4 1 2 -1
7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000 1000 0 2130285 1 d59cd2a0 21 4 0 2 -1
8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000 0 0 4982629 2 d2727260 40 4 8 2 2
9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000 0 0 4864416 5 e6061b40 42 12 27 3 -1
Vous pouvez ensuite relier les ports ouverts aux inodes, qui peuvent être liés aux processus et aux descripteurs de fichiers en effectuant un lien de lecture sur les descripteurs de fichiers répertoriés pour chaque processus:
obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]
Voir ici que l'inode 4847458 correspond au premier socket TCP dans la liste ci-dessus. La sortie de netstat -tapn le vérifie pour moi (et rappelez-vous que 0x50 == 80):
obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28850/cherokee-work
Lorsque le programme du moniteur remarque un changement dans / proc / net / tcp, analysez les données et déterminez si le changement est un socket nouvellement ouvert. Ensuite, vous pouvez simplement énumérer tous les descripteurs de fichiers pour chaque processus répertorié dans / proc, en effectuant un lien de lecture sur chacun pour trouver l'inode correspondant. Une fois que vous avez trouvé cela, vous disposez du pid propriétaire, à partir duquel vous pouvez obtenir tout ce que vous souhaitez, en particulier si vous avez un processus de comptabilité.
Si vous n'avez pas besoin que votre notification soit instantanée, alors votre programme de surveillance pourrait utiliser un sondage lent (peut-être une période de 50 ms ou 100 ms, voire 1000 ms).