1. Linux运维三剑客:netstat、ps、lsof深度解析
在Linux系统运维工作中,排查问题就像侦探破案,而netstat、ps和lsof就是我们手中的"三件套"。这三个命令各司其职又相互配合,能帮我们快速定位各种系统问题。记得我刚入行时,面对服务器异常经常手足无措,直到掌握了这三个命令的组合用法,排查效率才有了质的飞跃。
1.1 工具定位与协作关系
这三个命令在运维工作中形成了完美的侦查闭环:
-
netstat:网络层面的"交通监控",负责告诉我们哪些端口在监听、谁在连接我们的服务器。就像机场的安检系统,记录所有进出的"旅客"(网络连接)。
-
ps:进程层面的"人口普查",展示系统中所有进程的详细信息。相当于给每个运行中的程序拍了张"证件照",记录它们的身份信息和资源占用情况。
-
lsof:文件层面的"关联分析",揭示进程与文件/网络连接的关系。如同一个侦探,能找出某个文件被谁打开,或者某个端口被哪个进程占用。
它们的典型协作流程是:先用netstat发现异常端口,再用lsof定位具体进程,最后用ps查看该进程的详细信息。这个组合拳能解决90%的端口占用、进程异常等问题。
2. netstat:网络连接分析利器
2.1 安装与基本使用
在较新的Linux发行版中,netstat可能默认未安装。安装命令如下:
bash复制# CentOS/RHEL系统
yum install -y net-tools
# Ubuntu/Debian系统
apt install net-tools
注意:很多新系统推荐使用ss命令替代netstat,但netstat的语法对初学者更友好,输出也更易读。
2.2 核心参数详解
netstat的强大之处在于它的各种参数组合,以下是常用场景:
bash复制# 查看所有TCP/UDP监听端口(最常用)
netstat -tunlp
# 参数解释:
# -t:显示TCP连接
# -u:显示UDP连接
# -n:以数字形式显示地址和端口(不解析为服务名)
# -l:仅显示监听状态的套接字
# -p:显示进程ID和程序名
典型输出示例:
code复制Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp6 0 0 :::80 :::* LISTEN 5678/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 9102/dhclient
输出解读:
- 0.0.0.0表示监听所有IPv4地址
- :::表示监听所有IPv6地址
- LISTEN状态表示端口正在等待连接
- 最后一列显示了占用端口的进程ID和程序名
2.3 实用场景示例
场景1:查找特定端口占用
bash复制netstat -tunlp | grep 3306
场景2:查看所有活跃连接
bash复制netstat -an
场景3:统计各协议的连接数
bash复制netstat -s
场景4:持续监控网络状态
bash复制netstat -c 2
# 每2秒刷新一次
经验分享:当服务器出现"Address already in use"错误时,netstat -anp | grep TIME_WAIT可以帮助找出大量处于TIME_WAIT状态的连接,这通常是短连接过多导致的。
3. ps:进程管理专家
3.1 两种输出风格对比
ps命令有两种主要的参数风格:BSD风格和UNIX风格。
BSD风格(ps -ef)
bash复制ps -ef
输出示例:
code复制UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan01 ? 00:00:01 /sbin/init
root 123 1 0 Jan01 ? 00:00:00 /usr/lib/systemd/systemd-journald
特点:
- 显示完整的进程树(通过PPID字段)
- 包含进程启动时间(STIME)
- CMD字段显示完整命令
UNIX风格(ps aux)
bash复制ps aux
输出示例:
code复制USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 123456 7890 ? Ss Jan01 0:01 /sbin/init
root 123 0.0 0.2 234567 8901 ? S Jan01 0:00 /usr/lib/systemd/systemd-journald
特点:
- 显示详细的资源占用(%CPU、%MEM)
- VSZ和RSS显示内存使用情况
- STAT显示进程状态
- 更适合监控系统负载
3.2 实用技巧
查找特定进程
bash复制ps -ef | grep nginx
按资源占用排序
bash复制# 按CPU使用率降序
ps aux --sort=-%cpu | head -10
# 按内存使用降序
ps aux --sort=-%mem | head -10
查看进程树
bash复制ps -ef --forest
避坑指南:使用ps查找进程时,grep本身也会出现在结果中。可以加上grep -v grep来排除,或者使用pgrep命令替代。
4. lsof:无所不能的文件侦探
4.1 基本用法
lsof(List Open Files)的强大之处在于Linux中"一切皆文件"的设计理念。它不仅能查看普通文件,还能查看网络连接、设备文件等。
常用场景:
bash复制# 查看某个端口被谁占用
lsof -i :80
# 查看某个进程打开的文件
lsof -p 1234
# 查看某个用户打开的文件
lsof -u root
# 查看某个程序打开的文件
lsof -c nginx
# 查看被删除但仍被进程占用的文件(可恢复)
lsof | grep deleted
4.2 典型输出解析
执行lsof -i :80可能输出:
code复制COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
nginx 1235 nginx 6u IPv4 12345 0t0 TCP *:http (LISTEN)
字段解释:
- COMMAND:进程名
- PID:进程ID
- USER:运行用户
- FD:文件描述符
- TYPE:文件类型
- NAME:文件名或网络地址
4.3 高级用法
查看某个目录下的文件操作
bash复制lsof +D /var/log
查看网络连接
bash复制# 所有TCP连接
lsof -i tcp
# 所有UDP连接
lsof -i udp
查找导致磁盘空间不足的进程
bash复制lsof / | grep -E '^COMMAND|deleted'
实用技巧:当磁盘空间显示已满但找不到大文件时,很可能是某个大文件被删除但仍被进程占用。用lsof | grep deleted可以找到这些文件,重启相关进程后空间就会释放。
5. 三剑客组合实战案例
5.1 案例1:端口占用排查
问题现象:启动服务时报错"Port 8080 already in use"
排查步骤:
- 确认端口占用情况:
bash复制netstat -tunlp | grep 8080
- 如果netstat没有显示进程信息,使用lsof精准定位:
bash复制lsof -i :8080
- 查看占用进程的详细信息:
bash复制ps -ef | grep <PID>
- 根据情况终止进程:
bash复制# 先尝试正常终止
kill -15 <PID>
# 如果无效再强制终止
kill -9 <PID>
5.2 案例2:高CPU占用排查
问题现象:服务器CPU使用率持续100%
排查步骤:
- 找出CPU占用最高的进程:
bash复制ps aux --sort=-%cpu | head -5
- 查看该进程的详细信息:
bash复制ps -ef | grep <PID>
- 查看该进程打开的文件和连接:
bash复制lsof -p <PID>
- 根据收集的信息决定处理方式(重启、优化等)
5.3 案例3:磁盘空间异常
问题现象:df显示磁盘已满,但du找不到大文件
排查步骤:
- 查找被删除但仍被占用的文件:
bash复制lsof | grep deleted
- 确认占用这些文件的进程:
bash复制ps -ef | grep <PID>
- 安全地重启相关服务释放空间
6. 常见问题与解决方案
6.1 netstat常见问题
Q1:netstat显示TIME_WAIT连接过多怎么办?
A1:这是TCP连接的正常状态,通常会等待2MSL(约1-4分钟)后自动关闭。如果过多,可以考虑:
- 调整内核参数(net.ipv4.tcp_tw_reuse等)
- 优化应用代码,避免频繁创建短连接
Q2:为什么netstat看不到进程名?
A2:需要以root权限运行,或者使用sudo。普通用户可能看不到其他用户的进程信息。
6.2 ps常见问题
Q1:ps aux和ps -ef有什么区别?
A1:主要区别在于输出格式和信息侧重:
- ps aux:侧重资源占用,显示%CPU、%MEM等
- ps -ef:侧重进程关系,显示完整的PPID信息
Q2:如何查看某个用户的全部进程?
A2:使用-u参数:
bash复制ps -u username
# 或
ps aux | grep username
6.3 lsof常见问题
Q1:lsof执行很慢怎么办?
A1:可以限制范围提高速度:
bash复制# 只查看TCP连接
lsof -i tcp
# 只查看某个目录
lsof +D /path
Q2:如何查看某个文件被哪些进程使用?
A2:直接指定文件路径:
bash复制lsof /path/to/file
7. 性能优化与进阶技巧
7.1 替代方案:ss vs netstat
在新版Linux中,推荐使用ss替代netstat,因为它:
- 直接从内核获取信息,速度更快
- 显示的信息更详细
- 支持更多的过滤选项
常用命令:
bash复制# 等同于netstat -tunlp
ss -tunlp
# 查看所有TCP连接
ss -t -a
7.2 进程树查看:pstree
对于理解进程关系,pstree比ps更直观:
bash复制pstree -p
7.3 实时监控:htop
htop是增强版的top,提供:
- 彩色界面
- 鼠标操作
- 更直观的进程信息
安装:
bash复制# CentOS/RHEL
yum install htop
# Ubuntu/Debian
apt install htop
8. 安全注意事项
-
谨慎使用kill -9:这会导致进程立即终止,没有机会执行清理工作。应该先尝试kill -15(SIGTERM)。
-
注意命令权限:很多系统信息需要root权限才能查看完整内容,但也要避免滥用root权限。
-
保护敏感信息:ps和lsof可能显示敏感信息(如数据库密码在命令行参数中),分享结果前要仔细检查。
-
生产环境谨慎操作:在重要服务器上执行任何操作前,最好先在测试环境验证。
我在实际运维工作中发现,掌握这三剑客的组合用法,能解决大部分系统问题。刚开始可能会记不住各种参数,但通过制作cheatsheet或保存常用命令,很快就能熟练使用。记住,最好的学习方式就是实践——遇到问题时多尝试用这些命令分析,积累经验。