2022-12-15 14:02:23
在Linux系统中,查找占用特定端口的进程可通过netstat或ss命令实现,二者结合使用能高效定位问题。以下是具体方法及扩展工具说明:
一、使用 netstat 命令netstat 是经典工具,通过解析/proc文件系统获取网络连接信息,适合大多数场景。
基本语法:
sudo netstat -tulnp | grep :<端口号>选项说明:
-t:显示TCP连接。
-u:显示UDP连接。
-l:仅显示监听状态的套接字。
-n:以数字形式显示地址和端口,避免解析主机名和服务名(加快速度)。
-p:显示进程ID(PID)和程序名称(需root权限)。
示例:查找占用80端口的进程
sudo netstat -tulnp | grep :80输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12345/nginx关键信息:12345为PID,nginx为进程名。
ss(Socket Statistics)是netstat的现代替代品,直接从内核获取信息,性能更高,尤其适合高并发场景。
基本语法:
sudo ss -tulnp | grep :<端口号>选项说明:与netstat基本一致,但输出更简洁。
示例:查找占用3306端口(MySQL默认端口)的进程
sudo ss -tulnp | grep :3306输出示例:
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=54321,fd=28))关键信息:mysqld为进程名,54321为PID。
获取PID后,使用ps命令查看进程的完整信息(如用户、启动时间、命令行参数等):
ps -ef | grep <PID># 或ps aux | grep <PID>终止进程(慎用):sudo fuser -k -n tcp 80
通过ps aux | grep <PID>查看进程的用户和启动命令,判断是否为预期服务。
例如,Nginx的错误日志(/var/log/nginx/error.log)或通过journalctl -u <服务名>查看系统日志。
使用systemctl stop <服务名>(Systemd系统)或service <服务名> stop(SysVinit系统)。
确保多个服务未配置为监听同一端口(如Nginx和Apache默认均监听80端口)。
若端口处于TIME_WAIT状态(历史连接遗留),可调整内核参数net.ipv4.tcp_tw_reuse=1(需谨慎)。