netstat是用来查出网络连接相关信息的命令,他是一种分析型的命令,所有的数据都存放在proc下面。netstat去proc下读取信息然后将信息输出。
如果不了解什么是proc,请参考
理解 Proc 文件系统
拿netstat -nlp这个命令做例子,n是使用数字来显示,l是监听,p是显示程序的PID和名称,以及程序的所有者
当执行netstat -nlp时,该命令首先在proc下遍历所有的PID/fd/目录,当fd目录中有socket句柄时,将其记录,然后再去proc/net/tcp (udp,unix)里查找与这些socket句柄相关的端口,proc/net/tcp里面的数字是16进制的,转换到10进制就是所看到的端口了。
在程序执行时,程序所打开的句柄可以在proc/pid/fd中查看,fd目录是700的,并且目录宿主就是执行该程序的用户,这样就可以通过FD目录的属性来确认程序的>执行用户,也就是参数p显示的所有者。
其实Shell下的很多命令都是读取proc的信息,然后格式化输出,例如pstree,vmstat等。如果你想得到一个特定的系统状态或程序状态,完全可以自己用Shell写一个类似netstat这种命令的脚本。