要查看某个端口被哪个服务或进程占用,可以使用以下方法:
1. 使用 ss
或 netstat
命令
这两个工具可以列出当前系统的端口占用情况。
方法 1:ss
(推荐,较新工具)
sudo ss -tulnp | grep <端口号>
示例(查看 80 端口):
sudo ss -tulnp | grep ':80'
输出示例:
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
nginx
是服务名称,1234
是进程 PID。
方法 2:netstat
(较旧,部分系统已弃用)
sudo netstat -tulnp | grep <端口号>
2. 使用 lsof
命令
lsof
可以查看文件(包括网络套接字)的占用情况。
sudo lsof -i :<端口号>
示例(查看 3306 端口):
sudo lsof -i :3306
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 5678 mysql 12u IPv6 12345 0t0 TCP *:3306 (LISTEN)
mysqld
是服务名称,5678
是进程 PID。
3. 通过进程 PID 查找服务(systemd
管理的服务)
如果占用端口的进程是由 systemd
管理的服务,可以进一步查找服务名:
systemctl status <PID>
或:
ps -p <PID> -o comm=
示例:
systemctl status 1234
输出:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since ...
- 这里可以看到
nginx.service
是该端口的服务。
4. 使用 fuser
命令
sudo fuser <端口号>/tcp
示例:
sudo fuser 80/tcp
输出:
80/tcp: 1234
1234
是占用该端口的进程 PID。
总结
方法 | 命令 | 适用场景 |
---|---|---|
ss | sudo ss -tulnp \| grep :<端口> | 推荐,查看监听端口 |
lsof | sudo lsof -i :<端口> | 查看具体进程 |
netstat | sudo netstat -tulnp \| grep :<端口> | 旧版系统备用 |
systemctl | systemctl status <PID> | 查看 systemd 管理的服务 |
fuser | sudo fuser <端口>/tcp | 快速查找占用端口的 PID |
示例流程
问题:谁占用了 3306 端口?
# 方法 1:ss
sudo ss -tulnp | grep ':3306'
# 方法 2:lsof
sudo lsof -i :3306
# 方法 3:通过 PID 查服务
sudo systemctl status 5678 # 假设 PID=5678
如果有具体端口需要排查,可以告诉我,我会提供更详细的指导!