You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询非固定使用端口的应用程序所用端口(以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行就行。
  • 如果是自己开发的应用,得看代码里的套接字绑定逻辑,或者启动脚本里的端口参数。
三、追踪调用sendfile/sendmsg的进程及其端口

要是你想实时看哪些进程在调用这两个系统调用,同时查到对应的端口,可以用strace工具:
先找到目标进程的PID,然后跑:

strace -e trace=sendfile,sendmsg -p [你的PID]

这个命令会实时输出进程调用这两个系统调用的细节,你能看到对应的文件描述符(比如fd=3),接着再用这条命令查这个fd对应的端口:

lsof -p [你的PID] | grep [文件描述符数字]

这样就能把调用和端口对应上了。

内容的提问来源于stack exchange,提问作者nath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:24:22