如何查询非固定使用端口的应用程序所用端口(以sendfile/sendmsg为例)
嘿,先给你澄清个容易混淆的点:sendfile和sendmsg可不是什么独立的应用程序哦,它们是Linux/Unix系统里的系统调用——简单说就是程序用来跟内核要服务的接口,本身并不直接占用端口。端口是网络套接字的属性,这俩调用只是用来给已经建立好的套接字传输数据的。不过我懂你意思,你要么是想查用了这些调用的应用当前在用的端口,要么是想找依赖它们的服务的默认端口,下面给你几种靠谱的方法:
如果你知道目标应用的进程名或者PID,用这些工具准没错:
用
netstat(大部分系统默认自带):
举个例子,假设你要查用sendfile传输静态文件的Nginx,直接跑这条命令:netstat -tulnp | grep nginx给你解释下参数:
-t:只显示TCP协议的端口-u:显示UDP协议的端口(如果需要的话)-l:过滤出处于监听状态的端口(也就是对外提供服务的端口)-n:用数字显示IP和端口,不解析域名和端口名,速度更快-p:显示对应端口的进程名和PID,方便确认是不是你要找的应用
输出里的Local Address列,冒号后面的数字就是应用正在用的端口。
用
ss(现代Linux推荐,比netstat高效):
用法和netstat几乎一样,输出更简洁:ss -tulnp | grep nginx如果只知道进程PID:
比如进程PID是1234,直接查它打开的网络套接字:lsof -i -P -n -p 1234-i表示只显示网络相关的文件描述符,-P不把端口号转成服务名(比如不把80转成http),-n不解析IP地址,输出里的PORT列就是你要找的端口。
有些依赖sendfile/sendmsg的服务会有默认端口,比如HTTP默认80、HTTPS默认443、FTP默认21这些。如果是自定义应用,就得看它的配置文件:
- Nginx的配置通常在
/etc/nginx/nginx.conf或者/etc/nginx/conf.d/目录下,找listen指令,后面跟着的就是默认监听的端口。 - Apache的配置在
/etc/httpd/conf/httpd.conf(不同发行版可能路径不同),找Listen行就行。 - 如果是自己开发的应用,得看代码里的套接字绑定逻辑,或者启动脚本里的端口参数。
要是你想实时看哪些进程在调用这两个系统调用,同时查到对应的端口,可以用strace工具:
先找到目标进程的PID,然后跑:
strace -e trace=sendfile,sendmsg -p [你的PID]
这个命令会实时输出进程调用这两个系统调用的细节,你能看到对应的文件描述符(比如fd=3),接着再用这条命令查这个fd对应的端口:
lsof -p [你的PID] | grep [文件描述符数字]
这样就能把调用和端口对应上了。
内容的提问来源于stack exchange,提问作者nath

