/ 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
その後、開いているポートをiノードに関連付けることができます。iノードは、プロセスごとにリストされたファイル記述子でreadlinkを実行することにより、プロセスとファイル記述子に関連付けることができます。
obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]
ここで、iノード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を見つけます。それを見つけると、特にプロセスアカウンティングをオンにしている場合は、所有するpidがあり、そこから必要なものを入手できます。
通知を瞬時に行う必要がない場合は、モニタープログラムで低速のポーリング(おそらく50ミリ秒または100ミリ秒、さらには1000ミリ秒)を使用できます。