Ви можете написати програму для моніторингу / proc / net / tcp, вихід якої виглядає приблизно так:
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
Потім можна пов’язати відкриті порти з inode, які можуть бути пов'язані назад з процесами та дескрипторами файлів, виконавши readlink на дескрипторах файлів, перелічених для кожного процесу:
obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]
Дивіться тут, що inode 4847458 відповідає першому сокету tcp у списку вище. Вихід netstat -tapn підтверджує це для мене (і нагадаємо, що 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
Коли програма монітора помітить зміну в / proc / net / tcp, проаналізуйте дані та визначте, чи є зміна нещодавно відкритим сокетом. Тоді ви можете просто перерахувати всі дескриптори файлів для кожного процесу, переліченого в / proc, зробивши readlink на кожному, щоб знайти відповідний inode. Як тільки ви виявите це, у вас є підручник, з якого ви можете отримати все, що ви хочете, особливо якщо у вас є облік процесів.
Якщо вам не потрібно миттєве повідомлення, програма монітора може використовувати повільне опитування (можливо, період 50 мс або 100 мс, а то й 1000 мс).