测试老鸟总结:这15个Linux命令,解决了我们90%的定位问题

在软件测试领域,问题定位能力是衡量一个测试工程师专业度的重要标尺。当我刚入行时,最头疼的就是面对一个复杂问题却不知从何下手。经过多年的摸爬滚打,我逐渐发现,掌握了下面这15个Linux命令,就能解决我们工作中90%的问题定位需求。

为什么Linux命令如此重要?

在分布式系统和云计算成为主流的今天,绝大多数服务器都运行在Linux环境下。测试人员需要通过命令行与远程服务器交互,查看日志、分析性能、诊断问题。图形界面虽然友好,但命令行才是最高效、最直接的问题定位工具。

让我们先从系统整体状态的命令开始,逐步深入到具体问题定位。

一、系统整体状态查看

1. top - 实时系统监控

top命令是Linux下最常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

yaml 复制代码
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命令可以快速查看系统运行时间、用户数和平均负载。

bash 复制代码
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命令用于显示磁盘分区上的可用和已用空间。

bash 复制代码
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命令用于查看文件或目录的磁盘使用情况。

bash 复制代码
# 查看当前目录下各子目录大小
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命令显示系统内存的使用情况,包括物理内存、交换分区等。

vbnet 复制代码
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命令替代。

ruby 复制代码
# 查看所有已建立的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是最基础但必不可少的网络诊断工具。

bash 复制代码
# 基本用法
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 - 网络路径追踪

当网络连通性出现问题时,这两个命令可以帮助定位问题发生的网络节点。

bash 复制代码
# 传统traceroute
traceroute example.com
# 更强大的mtr(实时刷新)
mtr example.com

mtr优势: 结合了ping和traceroute的功能,提供实时刷新的统计数据,更容易发现网络抖动和丢包问题。

四、进程与性能分析

10. ps - 进程状态查看

ps命令用于显示当前进程的状态信息,是进程分析的基础工具。

perl 复制代码
# 查看指定进程的详细信息
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中"一切皆文件",所以这实际上可以查看进程打开的各种资源。

perl 复制代码
# 查看某个进程打开的文件
lsof -p 1234
# 查看某个端口被哪个进程占用
lsof -i :8080
# 查看某个用户打开的文件
lsof -u username
# 恢复被删除但仍被进程占用的文件
lsof | grep deleted
# 然后通过 /proc/pid/fd/fd_num 恢复文件

实战案例: 当无法卸载磁盘时,通常是因为有进程仍在访问磁盘上的文件。使用lsof /mount/point可以找出这些进程。

五、日志分析神器

12. tail/head - 日志首尾查看

最基本的日志查看命令,看似简单但使用频率极高。

bash 复制代码
# 查看日志最后100行
tail -100f application.log
# 实时跟踪日志增长
tail -f application.log
# 查看日志开头100行
head -100 application.log
# 多文件同时跟踪
tail -f log1.log log2.log

13. grep - 文本搜索

grep是文本搜索的瑞士军刀,在日志分析中不可或缺。

perl 复制代码
# 基本搜索
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不仅仅是一个命令,更是一门编程语言,在日志分析中极为强大。

bash 复制代码
# 提取特定字段(例如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适合对日志进行批量处理和转换。

bash 复制代码
# 替换文本(将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占用问题

bash 复制代码
# 找到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:分析接口响应慢问题

bash 复制代码
# 实时统计接口响应时间
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:排查内存泄漏

bash 复制代码
# 定时记录内存使用情况
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

七、进阶技巧与工具

掌握了基础命令后,可以进一步学习这些进阶技巧:

  1. 命令组合技巧:管道符|、重定向>>>、后台运行&
  2. 正则表达式:提升grep、sed、awk的使用效果
  3. 脚本化:将常用的排查流程编写成脚本,提高效率
  4. 性能监控:学习使用vmstat、iostat、sar等更专业的性能工具

总结

作为测试工程师,问题定位能力是我们的核心竞争力。掌握这15个Linux命令,并不意味着我们要成为系统管理员,而是为了在遇到问题时能够快速自主地获取信息、分析定位,而不是盲目求助于他人。

这些命令我已经使用了十年,至今仍然每天都在使用。它们看起来简单,但组合起来却能解决绝大多数问题定位需求。建议各位测试同仁不仅要了解这些命令的基本用法,更要理解其原理和适用场景,通过实际案例不断练习,最终形成自己的问题定位方法论。

记住,最好的工具不是最复杂的,而是你最熟悉、最能灵活运用的。希望这些经验分享能帮助你在测试道路上越走越远,越走越顺!

你在问题定位过程中有哪些心得或困惑?欢迎在评论区分享交流~

本文原创于【程序员二黑】公众号,转载请注明出处!

欢迎大家关注笔者的公众号:程序员二黑,专注于软件测试干活分享,全套测试资源可免费分享!

最后如果你想学习软件测试,欢迎加入笔者的交流群:785128166,里面会有很多资源和大佬答疑解惑,我们一起交流一起学习!

相关推荐
Apifox21 小时前
理解和掌握 Apifox 中的变量(临时、环境、模块、全局变量等)
前端·后端·测试
OEC小胖胖1 天前
代码质量保障:使用Jest和React Testing Library进行单元测试
前端·react.js·单元测试·前端框架·web
liang_jy2 天前
Android 单元测试(二)—— 高级 Mock 技术
android·面试·单元测试
柒柒的代码学习日记2 天前
博客系统Web自动化测试项目:从用例设计到脚本执行全流程解析
自动化测试·测试·测试项目
liang_jy2 天前
Android 单元测试(一)—— 基础
android·面试·单元测试
王喵喵喵2 天前
每天一个安卓测试开发小知识之 (四)---常用的adb shell命令第二期 pm命令
android·测试
茯苓gao2 天前
变频器实习DAY41 单元测试介绍
笔记·学习·单元测试
Sagittarius_A*2 天前
Maven + JUnit:Java单元测试的坚实组合
java·后端·单元测试·maven
ItKnow2 天前
IntelliJ IDEA2025+启动项目提示 Failed to instantiate SLF4J LoggerFactory
java·单元测试·intellij-idea