在软件测试领域,问题定位能力是衡量一个测试工程师专业度的重要标尺。当我刚入行时,最头疼的就是面对一个复杂问题却不知从何下手。经过多年的摸爬滚打,我逐渐发现,掌握了下面这15个Linux命令,就能解决我们工作中90%的问题定位需求。
为什么Linux命令如此重要?
在分布式系统和云计算成为主流的今天,绝大多数服务器都运行在Linux环境下。测试人员需要通过命令行与远程服务器交互,查看日志、分析性能、诊断问题。图形界面虽然友好,但命令行才是最高效、最直接的问题定位工具。
让我们先从系统整体状态的命令开始,逐步深入到具体问题定位。
一、系统整体状态查看
1. top - 实时系统监控
top命令是Linux下最常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
top - 14:30:25 up 45 days, 8:12, 3 users, load average: 0.52, 0.58, 0.49
Tasks: 231 total, 1 running, 230 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.4 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15985.4 total, 512.3 free, 8125.6 used, 7347.5 buff/cache
MiB Swap: 2048.0 total, 1024.3 free, 1023.7 used. 7458.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1125 mysql 20 0 12.145g 4.832g 23488 S 12.3 30.2 333:45.67 mysqld
2238 www-data 20 0 402948 78264 15232 S 2.3 0.5 12:34.89 nginx
使用技巧:
-
按数字"1"可以显示每个CPU核心的详细使用情况
-
按"P"按CPU使用率排序,"M"按内存使用率排序
-
按"z"切换彩色/黑白显示
2. htop - 增强型系统监控
htop是top的增强版,提供了更直观的界面和更多的操作选项。
htop
优势:
-
支持鼠标操作,可以直接点击选择进程
-
垂直和水平滚动视图,查看完整的命令行
-
支持进程树状展示,清晰显示父子进程关系
3. uptime - 系统运行时间与负载
uptime命令可以快速查看系统运行时间、用户数和平均负载。
uptime
14:32:45 up 45 days, 8:14, 3 users, load average: 0.52, 0.58, 0.49
负载解读:
-
三个数字分别代表1分钟、5分钟和15分钟的平均负载
-
对于单核CPU,负载超过1.0表示系统过载
-
对于多核CPU,负载应该除以核心数来评估是否过载
二、磁盘与内存分析
4. df - 磁盘空间检查
df命令用于显示磁盘分区上的可用和已用空间。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 35G 15G 70% /
/dev/sdb1 200G 150G 50G 75% /data
tmpfs 7.8G 0 7.8G 0% /dev/shm
常用参数:
-
-h
:以人类可读的格式显示(GB、MB) -
-i
:显示inode使用情况而非块使用情况
5. du - 文件目录大小分析
du命令用于查看文件或目录的磁盘使用情况。
# 查看当前目录下各子目录大小
du -h --max-depth=1
2.5G ./logs
15G ./data
500M ./cache
18G .
# 查找大文件
find /data -type f -size +100M -exec du -h {} \; | sort -rh | head -10
实战场景: 当收到磁盘空间告警时,先用df确定哪个分区满了,然后用du深入分析具体是哪些目录或文件占用了大量空间。
6. free - 内存使用情况
free命令显示系统内存的使用情况,包括物理内存、交换分区等。
free -h
total used free shared buff/cache available
Mem: 15Gi 12Gi 1.2Gi 0.0Ki 2.3Gi 2.8Gi
Swap: 2.0Gi 1.5Gi 512Mi
关键指标:
-
available:可用内存,这是评估内存是否充足的关键指标
-
buff/cache:缓存内存,在需要时可以被回收使用
三、网络连接分析
7. netstat/ss - 网络连接查看
netstat曾经是网络连接分析的主力,现在逐渐被更高效的ss命令替代。
# 查看所有已建立的TCP连接
ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:ssh 192.168.1.50:52432
ESTAB 0 0 192.168.1.100:http 192.168.1.60:42351
# 查看监听端口
ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 *:80 *:* users:(("nginx",pid=5678,fd=6))
常见用途:
-
确认服务是否在指定端口监听
-
查看异常连接或过多连接,排查DDoS攻击
-
分析连接状态分布(ESTABLISHED、TIME_WAIT等)
8. ping - 网络连通性测试
ping是最基础但必不可少的网络诊断工具。
# 基本用法
ping example.com
# 指定次数和间隔
ping -c 5 -i 0.5 example.com
# 带时间戳记录(适合长时间测试)
ping example.com | while read pong; do echo "$(date): $pong"; done
9. traceroute/mtr - 网络路径追踪
当网络连通性出现问题时,这两个命令可以帮助定位问题发生的网络节点。
# 传统traceroute
traceroute example.com
# 更强大的mtr(实时刷新)
mtr example.com
mtr优势: 结合了ping和traceroute的功能,提供实时刷新的统计数据,更容易发现网络抖动和丢包问题。
四、进程与性能分析
10. ps - 进程状态查看
ps命令用于显示当前进程的状态信息,是进程分析的基础工具。
# 查看指定进程的详细信息
ps -ef | grep nginx
# 查看进程树
ps -ejH
ps axjf
# 查看指定用户进程
ps -u www-data
# 自定义输出格式
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10
实用技巧: 通过ps auxf
可以以树形结构显示所有进程,清晰展示进程间的父子关系。
11. lsof - 列出打开文件
lsof命令用于列出当前系统打开的文件,在Linux中"一切皆文件",所以这实际上可以查看进程打开的各种资源。
# 查看某个进程打开的文件
lsof -p 1234
# 查看某个端口被哪个进程占用
lsof -i :8080
# 查看某个用户打开的文件
lsof -u username
# 恢复被删除但仍被进程占用的文件
lsof | grep deleted
# 然后通过 /proc/pid/fd/fd_num 恢复文件
实战案例: 当无法卸载磁盘时,通常是因为有进程仍在访问磁盘上的文件。使用lsof /mount/point
可以找出这些进程。
五、日志分析神器
12. tail/head - 日志首尾查看
最基本的日志查看命令,看似简单但使用频率极高。
# 查看日志最后100行
tail -100f application.log
# 实时跟踪日志增长
tail -f application.log
# 查看日志开头100行
head -100 application.log
# 多文件同时跟踪
tail -f log1.log log2.log
13. grep - 文本搜索
grep是文本搜索的瑞士军刀,在日志分析中不可或缺。
# 基本搜索
grep "ERROR" application.log
# 显示前后上下文
grep -A 5 -B 5 "ERROR" application.log
# 递归搜索目录
grep -r "login failed" /var/log/
# 使用正则表达式
grep -E "5[0-9]{2}" access.log # 搜索5xx错误
# 排除某些内容
grep -v "DEBUG" application.log # 不显示DEBUG日志
高级技巧: 使用grep -o
只输出匹配的部分,结合sort | uniq -c | sort -nr
可以统计错误出现的频率。
14. awk - 文本处理
awk不仅仅是一个命令,更是一门编程语言,在日志分析中极为强大。
# 提取特定字段(例如nginx访问日志的第7字段:状态码)
awk '{print $7}' access.log
# 统计状态码出现次数
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 计算95百分位响应时间
awk '{print $NF}' access.log | sort -n | awk '{all[NR] = $0} END{print all[int(NR*0.95)]}'
# 过滤出响应时间大于1秒的请求
awk '$(NF-1) > 1 {print}' access.log
15. sed - 流编辑器
sed适合对日志进行批量处理和转换。
# 替换文本(将ERROR替换为CRITICAL)
sed 's/ERROR/CRITICAL/g' application.log
# 提取特定时间范围的日志
sed -n '/2023-01-01 14:00:00/,/2023-01-01 15:00:00/p' application.log
# 删除空行
sed '/^$/d' application.log
# 显示特定行范围(例如100-200行)
sed -n '100,200p' application.log
六、组合使用:实战案例
单独掌握这些命令很重要,但真正发挥威力的是将它们组合使用。
案例1:诊断高CPU占用问题
# 找到CPU占用最高的进程
top -bn1 | head -10
# 查看该进程的线程情况
ps -Lp <pid> -o tid,pcpu,time | sort -k2 -rn | head -10
# 查看该进程的堆栈信息,进一步定位问题代码
jstack <pid> # 如果是Java进程
pstack <pid> # 如果是C/C++进程
案例2:分析接口响应慢问题
# 实时统计接口响应时间
tail -f access.log | awk '{print $NF}' | \
awk '{if(NR%100==0){printf "Avg: %.2f Max: %.2f\n", sum/100, max; sum=0; max=0}
sum+=$1; if($1>max)max=$1}'
# 分析慢请求的分布
grep "slow" application.log | awk '{print $4}' | cut -d: -f1 | \
uniq -c | sort -k2 > request_distribution.txt
案例3:排查内存泄漏
# 定时记录内存使用情况
while true; do
date >> memory.log
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10 >> memory.log
echo "======================================" >> memory.log
sleep 60
done
# 对比分析内存增长趋势
awk '/^==/ {if (prev) print prev " -> " mem; prev=$0; mem=0}
/java/ {mem+=$4} END{print prev " -> " mem}' memory.log
七、进阶技巧与工具
掌握了基础命令后,可以进一步学习这些进阶技巧:
-
命令组合技巧:管道符
|
、重定向>
和>>
、后台运行&
-
正则表达式:提升grep、sed、awk的使用效果
-
脚本化:将常用的排查流程编写成脚本,提高效率
-
性能监控:学习使用vmstat、iostat、sar等更专业的性能工具
总结
作为测试工程师,问题定位能力是我们的核心竞争力。掌握这15个Linux命令,并不意味着我们要成为系统管理员,而是为了在遇到问题时能够快速自主地获取信息、分析定位,而不是盲目求助于他人。
这些命令我已经使用了十年,至今仍然每天都在使用。它们看起来简单,但组合起来却能解决绝大多数问题定位需求。建议各位测试同仁不仅要了解这些命令的基本用法,更要理解其原理和适用场景,通过实际案例不断练习,最终形成自己的问题定位方法论。
记住,最好的工具不是最复杂的,而是你最熟悉、最能灵活运用的。希望这些经验分享能帮助你在测试道路上越走越远,越走越顺!
你在问题定位过程中有哪些心得或困惑?欢迎在评论区分享交流~
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。