Linux查看端口占用

Linux查看端口占用

引言

启动服务时报Address already in use,说明目标端口被别的进程占着。上线前要确认端口是否监听、被哪个PID占用,常用ss、netstat、lsof三个工具,先定位进程再决定停掉还是换端口。

ss查看(推荐)

ss替代netstat,更快更全:

ss -tlnp | grep 80
  • -t TCP,-l 监听状态,-n 数字端口不解析,-p 显示进程PID和名称。
    看TCP监听端口最直接。

netstat兼容命令

老系统没有ss时:

netstat -tlnp | grep 80

参数含义和ss一致,输出本地地址:端口、PID/程序名。

lsof按端口查进程

lsof -i:80

直接列出占用80端口的进程命令、PID、用户,适合只盯单个端口。

找到并处理

确认是无用进程后:

kill -9 PID

若是被系统服务占用,优先systemctl stop对应服务,别盲目kill。

查看所有监听端口

ss -tlnp

不加grep,列出全部TCP监听,盘点机器开了哪些服务。

注意事项

  • 查端口要root或sudo,普通用户看不到别的进程PID;
  • 状态LISTEN才是监听,ESTABLISHED是已建立连接,别混淆;
  • 端口被占先判断是不是正常服务,误杀线上进程影响业务;
  • 云服务器端口不通还要查安全组和防火墙,不只是本机占用;
  • ss在新发行版预装,netstat需装net-tools。

总结

日常用ss -tlnp grep端口最省事,netstat兼容老系统,lsof -i:端口看单个占用。定位PID后先确认进程归属再kill,端口连不上时本机占用、防火墙、云安全组三层都要排查。


emer 发布于  2026-10-19 07:25 

Linux查看端口被占用,lsof和netstat命令

前言

启动服务的时候报"Address already in use"?想知道某个端口被哪个进程占了?Linux查看端口占用最常用的就是lsof和netstat命令,本文讲清楚。

一、为什么要查端口

  • 启动服务报端口被占
  • 看某个服务有没有启动
  • 排查安全问题,看有没有可疑端口

二、lsof命令

查看某个端口被哪个进程占用

lsof -i:端口号

例子: 查80端口

lsof -i:80

输出:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)

看什么:

  • COMMAND:进程名(nginx)
  • PID:进程ID(1234)
  • USER:运行用户(root)

查看所有TCP端口

lsof -i tcp

查看所有UDP端口

lsof -i udp

杀掉占用端口的进程

kill -9 $(lsof -ti:80)

三、netstat命令

查看某个端口

netstat -tlnp | grep 端口号

例子: 查80端口

netstat -tlnp | grep :80

输出:

tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  1234/nginx

看什么:

  • 最后一列:进程ID/进程名(1234/nginx)

参数解释

参数 含义
-t TCP端口
-l 只看监听中的
-n 显示数字,不解析域名
-p 显示进程名和PID

查看所有监听端口

netstat -tlnp

四、ss命令(推荐)

ss是netstat的升级版,更快。

查看某个端口

ss -tlnp | grep 端口号

例子:

ss -tlnp | grep :80

查看所有监听端口

ss -tlnp

五、三种命令对比

命令 优点 缺点
lsof 信息全,能看文件 慢
netstat 经典,大家都用 慢
ss 最快,推荐 新命令

推荐: 用ss,最快。

六、常见场景

场景1:启动Nginx报端口被占

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

排查:

lsof -i:80

解决: 杀掉占用的进程

kill -9 进程ID

场景2:看MySQL有没有启动

ss -tlnp | grep 3306

有输出就是启动了。

场景3:看SSH端口

ss -tlnp | grep sshd

七、常见坑

坑1:没加sudo看不到进程

普通用户只能看自己的进程,看不到别人的。

解决: 加sudo

sudo lsof -i:80
sudo netstat -tlnp

坑2:netstat命令找不到

CentOS7最小化安装没有netstat。

安装:

yum install -y net-tools

坑3:lsof命令找不到

安装:

yum install -y lsof

八、常用命令汇总

# 查80端口被谁占了
lsof -i:80
netstat -tlnp | grep :80
ss -tlnp | grep :80

# 看所有监听端口
netstat -tlnp
ss -tlnp

# 杀掉占用80端口的进程
kill -9 $(lsof -ti:80)

总结

记住:

  1. 查端口用 lsof -i:端口号
  2. 或者用 ss -tlnp | grep 端口号
  3. 看最后一列就是进程名和PID
  4. 杀掉用 kill -9 进程ID
  5. 推荐用ss,最快

最常用:

ss -tlnp | grep :80

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:48 

Linux查看端口被哪个进程占用,lsof命令

前言

启动服务的时候提示 "Address already in use",端口被占了,但不知道被哪个进程占了?这时候就需要用 lsof 或者 netstat 命令来查一下。本文讲一下怎么用。

lsof 命令

安装

CentOS 最小化安装可能没有 lsof:

yum install -y lsof

查看某个端口被哪个进程占用

lsof -i:端口号

比如看 80 端口被谁占了:

lsof -i:80

输出类似:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)

重点看:

  • PID:进程号
  • COMMAND:进程名

知道了 PID 之后,想杀掉就用 kill PID。

查看所有正在监听的端口

lsof -i -P -n | grep LISTEN

输出所有处于监听状态的端口和对应的进程。

netstat 命令

安装

来自 net-tools 包:

yum install -y net-tools

查看端口被哪个进程占用

netstat -tlnp | grep 端口号

比如看 80 端口:

netstat -tlnp | grep :80

输出类似:

tcp   0   0 0.0.0.0:80   0.0.0.0:*   LISTEN   1234/nginx

最后一列就是 PID/进程名。

参数解释

参数 含义
-t 显示 TCP 连接
-l 只显示监听状态的
-n 显示数字,不解析域名
-p 显示进程名和 PID

查看所有监听端口

netstat -tlnp

fuser 命令

查看端口被哪个进程占用

fuser 端口号/tcp

比如:

fuser 80/tcp

输出:

80/tcp:              1234

直接显示 PID,简单粗暴。

杀掉占用端口的进程

fuser -k 80/tcp

直接把占用 80 端口的进程杀掉。

常见场景

场景1:启动 Nginx 提示端口被占

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

查一下:

lsof -i:80

发现是旧的 nginx 进程没杀掉,直接杀:

kill 1234

或者:

fuser -k 80/tcp

场景2:3306 端口不知道被谁占了

lsof -i:3306

发现是 MySQL 进程,正常的。

场景3:找出所有被占用的端口

netstat -tlnp

列出所有正在监听的端口。

常见坑

坑1:lsof 命令找不到

执行 lsof 提示 command not found。

原因: 没装 lsof 包。

解决:

yum install -y lsof

坑2:普通用户看不到其他用户的进程

用普通用户执行 lsof,看不到 root 的进程。

原因: 权限不够。

解决: 加 sudo 或者切 root:

sudo lsof -i:80

坑3:端口明明没被占但提示被占

服务明明没启动,但启动时提示端口被占。

原因: 可能有 TIME_WAIT 状态的连接还没释放。

解决: 等一会儿再试,或者改端口。

坑4:杀了进程端口还是没释放

杀掉进程了,但端口还是显示被占。

原因: 进程还在退出中,等几秒就好了。

总结

命令 作用
lsof -i:端口号 查看端口被哪个进程占用
netstat -tlnp \| grep :端口号 用 netstat 查端口
fuser 端口号/tcp 查看端口对应的 PID
fuser -k 端口号/tcp 杀掉占用端口的进程

最常用的就是 lsof -i:端口号,一眼就能看到进程名和 PID。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 08:02 

Linux查看进程启动时间,ps和lsof命令使用

前言

想知道某个进程跑了多久?或者想知道哪个进程打开了某个文件?这时候就需要用到 ps 和 lsof 两个命令了。ps 用来查看进程信息,包括启动时间、运行状态等;lsof 用来查看进程打开了哪些文件。这两个命令是运维排查问题的必备工具。本文就详细讲一下这两个命令的使用。

ps 命令

基本用法

ps aux

输出所有进程的详细信息。

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 128000  5000 ?        Ss   Oct01   0:05 /usr/lib/systemd/systemd
root      123  0.0  0.2 150000 10000 ?        Ss   Oct01   0:10 /usr/sbin/sshd
nginx    4567  0.0  0.3 200000 15000 ?        S    Oct05   0:02 nginx: worker process

各列含义

列 含义
USER 进程所属用户
PID 进程ID
%CPU CPU占用百分比
%MEM 内存占用百分比
VSZ 虚拟内存大小
RSS 物理内存大小
TTY 终端
STAT 进程状态
START 启动时间
TIME 累计CPU时间
COMMAND 启动命令

查看进程启动时间

ps -p PID -o lstart

比如查看PID为123的进程的启动时间:

ps -p 123 -o lstart

输出:

STARTED
Mon Oct  1 10:30:45 2026

查看某个进程的详细信息

ps aux | grep nginx

按CPU占用排序

ps aux --sort=-%cpu | head -10

按内存占用排序

ps aux --sort=-%mem | head -10

lsof 命令

lsof = list open files,用来查看进程打开了哪些文件。

基本用法

lsof

列出所有进程打开的所有文件。

查看某个进程打开的文件

lsof -p PID

比如查看PID为123的进程打开了哪些文件:

lsof -p 123

查看某个文件被哪个进程占用

lsof 文件路径

比如查看 /var/log/nginx/access.log 被哪个进程占用:

lsof /var/log/nginx/access.log

查看某个端口被哪个进程占用

lsof -i :80

查看80端口被哪个进程占用。

查看某个用户打开的文件

lsof -u nginx

查看nginx用户打开的所有文件。

查看某个目录下被打开的文件

lsof +D /var/log/

查看 /var/log/ 目录下所有被打开的文件。

实际排查案例

案例1:磁盘空间没释放

删了一个大文件,但磁盘空间没释放。这是因为还有进程在写这个文件。

lsof | grep deleted

输出所有已删除但还被进程占用的文件。找到对应的PID,重启那个进程就能释放空间了。

案例2:端口被占用

启动Nginx的时候报错"Address already in use",说明80端口被占用了。

lsof -i :80

看是哪个进程占了80端口,杀掉或者换个端口。

案例3:进程启动时间不对

怀疑某个服务被重启过,看看启动时间。

ps -ef | grep nginx

或者更详细的:

ps -p PID -o lstart

案例4:找出谁在写日志

想知道哪个进程在写某个日志文件。

lsof /var/log/messages

常见坑

坑1:删了文件磁盘空间没释放

这是最常见的坑。删了大文件,但磁盘空间没释放,因为还有进程在写这个文件。

解决: 用 lsof | grep deleted 找到还在写这个文件的进程,重启那个进程,或者直接清空文件内容:

> /var/log/nginx/access.log

坑2:ps aux 和 ps -ef 搞混了

ps aux 和 ps -ef 输出格式不一样,但信息基本一样。aux 是BSD格式,-ef 是System V格式。看个人习惯。

坑3:lsof 输出太多

lsof 不加参数会输出一大堆,根本看不过来。一定要加参数过滤:-p、-i、-u、+D 等。

总结

查看进程信息的核心命令:

  1. ps aux:看所有进程的基本信息
  2. ps -p PID -o lstart:看某个进程的启动时间
  3. lsof -p PID:看某个进程打开了哪些文件
  4. lsof -i :端口:看某个端口被哪个进程占用
  5. lsof | grep deleted:看哪些已删除文件还被进程占用

ps 和 lsof 是运维排查问题的基本功,遇到问题先跑一遍这两个命令,大部分问题都能定位到方向。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:40 
'); })();