软件测试必会Linux命令实战:日志排查与性能监控
2026/9/8 9:16:17 网站建设 项目流程

做软件测试这些年,我越来越觉得Linux命令是和测试理论同等重要的硬功夫。不管是功能测试、接口测试还是性能测试,只要你的被测系统是部署在服务器上的,终归绕不开“上服务器看一眼日志、查一下进程、看看磁盘空间”这些操作。尤其是现在很多公司的测试环境都是Linux容器或虚拟机,你会不会用命令,直接决定了排查问题的效率。这篇文章不打算给你堆砌一份面向运维的完整命令大全,而是想站在测试人员的实际工作场景里,把那些高频使用、能真正解决测试问题的Linux命令整理出来,每个命令都会配合我实测过的运行结果,方便你对照着看,也可以直接抄去用。

1. 测试环境里,先抓稳文件和目录操作

1.1 穿梭路径:cd、pwd、ls 的日常组合

测试工作里最烦的其实不是复杂的逻辑,而是“目录都找不到”。我一进测试环境,第一件事永远是pwd确认当前路径,然后用ls看目录里有什么。很多测试新手在Windows上被图形界面惯坏了,到了Linux里一输入命令就心虚,其实路径就是两件事:你在哪、你要去哪。

pwd会打印当前工作目录的绝对路径,比如:

$ pwd /home/tester/app/logs

ls不只是列出文件名,它有几个参数在实际排查中特别有用。ls -l能显示权限、属主、文件大小和修改时间;ls -lh会把大小显示成人类易读的K、M、G单位;ls -lt按时间倒序排列,方便你找最新修改的日志文件。我自己常用的组合是ls -lht,先看最新的文件是哪个,再配合后续的日志命令去查看。

cd切换目录时有一个很容易被忽略的点:cd ..是返回上一级,cd ../..是上两级,cd -是回到上一次所在的目录。多个日志目录来回切换的场景下,cd -真的能省不少事。很多人习惯自己手动敲绝对路径,结果敲错一个字母被报错弄得心烦意乱,其实只要先cd /home/tester/app/logs进了正确的根目录,再用相对路径一层层往下走,出错概率会低很多。

1.2 文件复制、移动、删除的几个关键细节

测试人员经常要把测试包从一台机器拷贝到另一台,或者把旧的日志清理掉。cpmvrm这三个命令表面上简单,但实际上有几个细节如果不注意,是会出事的。

复制目录必须加-r,这是测试新手的经典错误。比如把整个config目录复制成备份:

$ cp -r config config_bak $ ls -l drwxr-xr-x 2 tester tester 4096 4月 10 10:23 config drwxr-xr-x 2 tester tester 4096 4月 10 10:23 config_bak

如果你忘了-r,报错信息是cp: omitting directory 'config',这个报错本身就是提示,说明目录不会被复制,只是被跳过了。

移动文件用mv,它的好处是同一个文件系统内移动,速度很快,代价只是改个目录项。但跨文件系统移动的时候,它实际上是“复制+删除”的过程,对于超大日志文件来说会明显卡顿,这个心理预期要有。

删除文件就要特别谨慎了。rm -rf这个组合是每个Linux用户都听说过的风险命令,-r表示递归删目录,-f表示强制删除不提示。我个人的习惯是,删除前先用ls确认路径,或者干脆先mv到一个临时目录,确认没问题再删。尤其是在测试环境里,曾经出现过同事手滑把log目录拼成local目录,一条命令下去,整个环境配置文件全没了。宁可多敲一个ls,也不要拿rm -rf去赌自己的手速。

mkdir -p也是测试中特别实用的参数。它会自动创建不存在的上级目录,比如:

$ mkdir -p /home/tester/reports/2025/04 $ ls /home/tester/reports/2025/04

如果不用-p,前面的2025目录不存在时会直接报错,你会陷入“要先创建一级再创建二级”的笨拙循环。

2. 日志排查是测试的日常,grep 和 tail 最常用

2.1 实时跟踪日志:tail -f 的“现场直播”

测试工作中最刚需的操作,就是在系统运行的时候实时看日志。tail命令专门用来查看文件末尾的内容,默认查看最后10行。最经典的是tail -f,它会持续追踪文件内容的变化,新写入的日志会直接滚动出来,效果跟“直播”一样。

比如启动测试服务后,在另一个终端窗口里执行:

$ tail -f /home/tester/app/logs/app.log 2025-04-10 10:30:01.123 INFO [http-nio-8080-exec-1] com.demo.controller.UserController : 用户查询请求, userId=1001 2025-04-10 10:30:01.456 DEBUG [http-nio-8080-exec-2] com.demo.service.UserService : 查询数据库耗时 12ms 2025-04-10 10:30:02.000 WARN [http-nio-8080-exec-3] com.demo.config.RateLimitFilter : 接口访问频率超限, ip=192.168.1.88

按下Ctrl + C退出跟踪模式。这个操作在排查接口报错、观察异步任务执行情况、确认消息队列消费是否正常时,都是第一选择。还有一个变体是tail -n 100,表示显示最后100行,适合不想滚动太多、只看末尾部分日志的场景。

如果你不想一直开着终端“直播”,可以用tail -n 200 app.log > /tmp/last200.log把最后200行日志保存到临时文件再慢慢分析。反正原则就一条:先定位日志文件,再快速提取末尾内容,别一上来就打开整个日志文件看,几GB的日志文件用编辑器打开基本就卡死了。

2.2 grep 过滤日志:从“大海捞针”到“精准命中”

日志文件一大,tail就不够了,必须配合grep做内容过滤。grep是我在测试环境里使用频率最高的命令,没有之一。它的核心逻辑就是“按关键字搜索文本内容”,并输出包含关键字的行。

最基本的用法是搜索某个错误关键字:

$ grep "ERROR" /home/tester/app/logs/app.log 2025-04-10 09:45:11.220 ERROR [http-nio-8080-exec-5] com.demo.service.OrderService : 订单状态更新失败, orderId=20250410001 2025-04-10 09:48:37.891 ERROR [http-nio-8080-exec-7] com.demo.service.PaymentService : 支付回调验签失败, transactionId=TXN000123456

实际测试中,更常见的是“多个关键字组合过滤”,我需要同时满足“某个接口”和“报错”两个条件。这里我用的是grep -E或者管道符组合,比如:

$ grep "OrderService" app.log | grep "ERROR"

第一个grep先筛出包含OrderService的行,第二个grep再筛出包含ERROR的行,两次过滤叠起来就得到精确结果。这条命令看着简单,但在排查问题时的价值极高,比你在几千行日志里用肉眼找不知道高效多少倍。

还有几个参数值得记住。grep -i忽略大小写,适合搜索的单词大小写不确定的情况;grep -v反向匹配,过滤掉包含某个关键字的行,比如grep -v "DEBUG"可以排除调试日志;grep -A 5 "ERROR"表示匹配到 ERROR 后,额外输出后面5行内容,这在做错误上下文排查时特别有用,因为很多报错并非单行,而是需要看后面的堆栈信息才能判断原因。

平时排查问题,我还会用grep -c统计错误出现的次数,判断是偶发问题还是必现问题。比如:

$ grep -c "NullPointerException" app.log 17

这个数字一旦出现,基本就能判断这是个高频异常,不需要再去逐行数了。

2.3 定位日志文件的辅助命令:find 和 file

有时候你根本不知道日志文件放在哪,尤其是第一次接手一个不熟悉的测试环境。这时候find命令就派上用场了。它能按文件名、路径、时间等条件查找文件。

比如我要找一个所有以log结尾的文件:

$ find /home/tester/app -name "*.log" /home/tester/app/logs/app.log /home/tester/app/logs/error.log /home/tester/app/logs/access.log

如果记不清服务日志是在/var/log下还是在应用目录下,可以用find / -name "app.log" 2>/dev/null从根目录全盘查找,2>/dev/null是把权限不足的报错信息丢弃掉,不然满屏的Permission denied会把有用结果淹没掉。

file命令则是查看文件类型的,偶尔看见一个扩展名不明确的日志或数据文件,直接file filename就能看出它是文本文件、压缩文件还是二进制文件。比如:

$ file app.log app.log: ASCII text $ file app.log.gz app.log.gz: gzip compressed data, was "app.log", last modified: ...

这个命令的作用是帮你判断某个文件能不能直接vimcat查看,还是说它是个压缩文件需要先解压,对测试人员来说属于高频辅助工具。

3. 测试服务器上的进程和性能监控

3.1 用 ps 和 top 快速定位异常进程

排查后端问题时,订单处理变慢了、接口超时了,第一反应往往是看看服务器上的进程是否异常,以及CPU、内存占用率是不是飙高了。ps是进程查看的经典命令,它能列出当前系统中的进程快照。

用得最多的组合是ps -ef,它显示所有进程的完整信息,包括UID、PID、父进程PID、CPU占用、启动时间、执行命令等。如果你要查某个特定的服务进程,直接配合grep

$ ps -ef | grep java tester 12345 1 0 4月09 ? 00:23:45 /usr/lib/jvm/java-17/bin/java -jar demo-app.jar tester 12378 12345 0 4月09 ? 00:05:12 /usr/lib/jvm/java-17/bin/java -jar demo-app.jar

grep java会连自己这个grep命令本身也匹配出来,所以经常会在结果最后看到一条grep --color=auto java,这是正常现象,不用觉得奇怪。

如果你只关心某个服务的进程ID,可以用pgrep -f demo-app.jar,它直接输出PID,干净利落。在写脚本或需要kill某个进程时,这个命令尤其方便。

top命令则是“动态版”的进程监控,它会每隔几秒刷新一次,展示系统当前的CPU使用率、内存使用率、负载均值,以及各进程按CPU占用率排名的实时列表。进入top界面后,按P键按CPU排序,按M键按内存排序,按q退出。比如你在压测过程中看到某个进程CPU占用率一直是100%,那基本可以断定这个接口的实现有性能瓶颈,或者代码里出现了死循环。

3.2 端口和网络连接排查

测试过程中经常遇到“服务启动了但接口访问不通”的情况。这时候第一件事就是确认服务端口到底有没有在监听。netstat -tlnp或者ss -tlnp是查看端口监听状态的核心命令:

$ netstat -tlnp | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 12345/java

看到LISTEN状态且最后关联到12345/java,说明服务确实在监听8080端口。如果这里没有任何输出,说明服务可能根本没起来,或者被别的进程占用了端口,需要进一步排查启动日志。

如果是外部请求不通,还需要看连接是否建立。ss -tn可以列出所有已建立的TCP连接,统计某个IP的连接数时,可以配合awk做计数。比如压测的时候想看看当前并发连接数:

$ ss -tn | awk 'NR>1{print $5}' | awk -F: '{print $1}' | sort | uniq -c

这串命令的意思是把所有TCP连接的对端IP提取出来,再做去重统计,得出每个来源IP建立的连接数。这用来验证压测流量是否打到了被测服务上,非常直观。

3.3 磁盘空间和内存使用快速排查

测试环境跑一段时间后,最容易出现的资源问题就是“磁盘满了”。磁盘满会导致服务写日志失败、消息队列堆积、数据库事务无法提交,一系列连锁故障会让人非常头疼。所以每次环境有问题,我基本都会先看一眼磁盘使用率:

$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/vda1 50G 45G 2.1G 96% /

看到96%,基本就不用再猜了,先清理空间再说。如果要精确定位哪个目录占的空间最大,用du -sh /home/tester/app/*

$ du -sh /home/tester/app/* 248M /home/tester/app/bin 1.2G /home/tester/app/logs 36M /home/tester/app/conf

日志目录只用了几个星期就涨到了1.2G,这就是磁盘空间的主要消耗来源。测试环境的日志建议定期做清理或压缩,或者配置日志轮转策略,否则迟早会炸。

内存方面,free -h是最直接的工具:

$ free -h total used free shared buff/cache available Mem: 7.6G 4.2G 1.1G 128M 2.3G 2.9G Swap: 2.0G 512M 1.5G

这里真正有意义的是最后一列available,它表示在不触发交换的前提下,还可以分配给新进程的内存大小。free的数值小不要紧,buff/cache会随内核策略自动释放,所以判断内存吃紧要看available,而不要只盯着free

4. 文本处理三剑客:sed、awk、sort/uniq 的测试妙用

4.1 sed:批量替换和精准截取日志

测试人员拿到一批日志或者一批测试数据后,经常要做格式化处理。sed是流编辑器,它擅长做“按行处理”的替换、删除和插入操作。最常见的用法是全局替换某个关键词,比如我想把日志中的DEBUG全部改成TRACE,但不改变原文件内容、只输出到屏幕,可以这样写:

$ sed 's/DEBUG/TRACE/g' app.log | head -5 2025-04-10 10:30:01.456 TRACE [http-nio-8080-exec-2] com.demo.service.UserService : 查询数据库耗时 12ms

s/旧内容/新内容/g中的g表示每一行内所有匹配都替换,而不是只换第一个。如果你确认替换无误,需要写回原文件,则用sed -i 's/DEBUG/TRACE/g' app.log-i是直接修改文件,操作前一定要先备份,这个参数是“不可撤销”的。

另一个高频场景是按行号截取文件内容。比如我想看日志文件中第1000行到第1010行的内容:

$ sed -n '1000,1010p' app.log

-n表示不自动打印所有行,p表示打印匹配的行。这个用法在分析某个时间点前后的日志片段时极其高效,不用打开整个文件慢慢滚动。

4.2 awk:按列提取字段,做数据统计

awk在测试工作中最核心的价值是“按列拆分文本”。日志格式如果比较规整,用空格或制表符分隔,那么awk能轻松提取出你关心的部分。

比如前面我们查进程的那个命令:ps -ef | grep java,输出中第二列是PID。如果我想把PID和启动命令都提取出来,可以写:

$ ps -ef | grep java | grep -v grep | awk '{print $2, $8, $9}' 12345 /usr/lib/jvm/java-17/bin/java -jar

awk默认按空白字符切分每一行,$1是第一列、$2是第二列,依此类推。print后面可以拼多个字段,逗号会自动补一个空格。这个极简用法就已经能解决测试工作中大量“提取信息”的需求了。

如果日志里的时间字段和消息字段需要重新格式化,awk也能做到。比如我想把下面这行日志的“日期+级别+消息”三部分提取出来:

$ echo "2025-04-10 10:30:01.123 ERROR xxx" | awk '{print $1, $3, $4}' 2025-04-10 ERROR xxx

不要在awk里做太复杂的逻辑,测试工作往往只需要临时提取几个字段,复杂处理交给脚本更稳妥。

4.3 sort 和 uniq:统计重复项,快速判断数据分布

排序和去重统计在测试中主要用于两类场景:一类是验证接口返回的数据是否有重复,另一类是统计某个关键字出现的次数。sort按字典序排序,uniq去重并统计连续重复的次数。

关键是uniq只处理“相邻重复”的行,所以必须先sortuniq,顺序反了统计结果就不对。比如统计日志中出现过的接口路径次数:

$ grep "GET /api/user" app.log | awk '{print $7}' | sort | uniq -c | sort -nr 32 GET /api/user/info 18 GET /api/user/list

这个组合非常经典:grep先筛出包含关键字的行,awk提取第7列(请求路径),sort把相同路径排在一起,uniq -c统计次数,最后sort -nr按次数从大到小排列。这样一份“接口调用频率排行”就出来了,用来分析压测流量的分布情况、判断哪些接口被测得最多,都很有参考价值。

sort -nr里的n是按数字大小排序,r是倒序。如果你漏写了n,结果会变成字典序,10会排在2前面,直接得到错误结论,这个细节必须牢记。

5. 打包解压、权限管理和系统信息查询

5.1 tar、zip、unzip:测试包部署必备技能

测试环境部署的时候,最常见的交付物就是一个压缩包。后端给的测试包可能是demo-app.jar,前端资源可能是dist.tar.gz,文档可能是docs.zip。你必须要熟练掌握解压压缩的全部套路。

tar命令基础的压缩和解压格式一定要背下来:

$ tar -czvf demo-app.tar.gz demo-app/ # 压缩目录为 tar.gz $ tar -xzvf demo-app.tar.gz # 解压 tar.gz

-c创建归档,-x解压归档,-z使用 gzip 压缩,-v显示过程,-f指定文件名。如果你解压时看到tar: ... 无法 open: 没有那个文件或目录,大概率是-f后面的文件名写错了,或者文件根本没在当前目录。tar的参数顺序其实不用死记,但-f必须放在最后并且后面跟文件名,这是很多新手踩过的坑。

对于.zip文件,用zip压缩、unzip解压:

$ unzip test-reports.zip Archive: test-reports.zip creating: test-reports/ inflating: test-reports/index.html

如果你想解压到指定目录,用unzip test-reports.zip -d /tmp/reports。这里有个小技巧,unzip -l test-reports.zip可以不真正解压,只查看压缩包内有哪些文件,适合在解压之前先确认内容是否是你想要的,避免把一堆文件乱解压到当前目录。

5.2 权限基础:chmod 和 chown

测试环境里经常遇到“文件没权限”的报错,比如服务启动时提示Permission denied,或者打开日志文件时提示权限不够。这涉及到Linux的权限模型:每个文件有三个权限位(读、写、执行),分别对应三类用户(属主、属组、其他用户)。

chmod用来修改权限,最常用的数字表示法里,4代表读、2代表写、1代表执行。所以chmod 755 script.sh的含义是:属主拥有读写执行权限(4+2+1=7),属组拥有读和执行权限(4+1=5),其他人拥有读和执行权限(4+1=5)。

如果某个文件是别人上传的,你只有查看需求,但被挡住了,一个临时办法是把其他用户的可读权限打开:

$ chmod o+r app.log $ ls -l app.log -rw-r--r-- 1 tester tester 1024 4月 10 10:23 app.log

chown用来修改文件属主,比如把文件归属改给当前部署用户:

$ sudo chown tester:tester demo-app.jar

测试环境里的 sudo 权限通常需要申请,大家记得别天天想着乱用 sudo,而是先看看是不是自己的文件权限问题。

5.3 系统信息:uname、hostname、uptime 排查环境差异

测试环境里出现“本地好好的,服务器上报错”的情况时,经常会需要对比操作系统差异。uname -a能查看内核版本、主机名、处理器架构等信息:

$ uname -a Linux test-server-01 5.15.0-91-generic #101-Ubuntu SMP ... x86_64 x86_64 x86_64 GNU/Linux

hostname则直接输出当前服务器的主机名,在同时操作多台测试服务器时,这个命令能帮你确认自己是不是登录错了机器,别小看这个操作,我见过不少人在错误的服务器上重启服务,最后折腾半天才发现环境搞混了。uptime显示系统运行时间和负载均值:

$ uptime 10:45:01 up 12 days, 3:22, 2 users, load average: 2.01, 1.85, 1.62

load average后面的三个数字分别表示过去1分钟、5分钟、15分钟的系统负载。如果1分钟负载远高于5分钟和15分钟,说明系统刚刚经历了一波压力;如果长期大于CPU核数,说明系统可能一直处在过载状态。测试性能问题的时候,这几个数字能起到快速判断的作用。

6. 常见问题与排查技巧实录

6.1 高频问题速查:从现象到命令的对应关系

在实际带新人和排查问题的过程中,我总结了一些出现频率极高的问题场景。下面这个表格基本上可以当成测试环境首发排查清单来用。

现象优先排查命令可能的结论
接口超时、请求无响应topfree -hCPU/内存资源耗尽,或进程卡死
日志不更新df -h磁盘满了,写不进去
服务启动失败tail -n 100 启动日志端口被占用、配置文件错误、依赖服务没起
访问端口不通netstat -tlnp | grep 端口服务未监听,或防火墙拦截
数据库连接失败pingtelnet ip 端口网络不通、端口未开放、DB服务未启动
拿到一批乱码文本file 文件名文件是压缩文件或二进制,需要先转换格式
找不到日志文件find / -name "*.log" 2>/dev/null日志输出路径和预期不一致

这个表不追求覆盖所有问题,但给测试人员提供一个快速切入的思路。排查问题最重要的是先确认“问题边界”,然后再一步步缩小范围,而不是一上来就打开代码看逻辑。

6.2 给测试同学的最后几条经验

第一,所有“批量删除”和“批量替换”操作前,一定先备份或者先加打印预览。rm -rfsed -i这两类命令是测试环境事故的重灾区,一次回车操作可能就是几小时的返工。

第二,管道命令尽量短小清晰,拆开执行。很多人为了装酷,一条命令写十几个管道的组合,结果中间某一环节出问题,根本不知道错在哪里。我习惯把长命令拆成几步执行,先过滤、再提取、最后统计,每一步都确认一下中间结果。慢是慢一点,但排查问题更稳。

第三,别怕把命令写到本地的笔记里。我自己有一个“测试环境命令速查”文档,把所有高频命令、边界参数、遇到过的问题都记下来,尤其是那种“今天调试了半小时终于搞定的命令”,下次遇到相似场景直接翻笔记,效率提升非常明显。

测试的本质是找到系统的薄弱点,而Linux命令就是你接近这些薄弱点的手段。它不神奇,但足够高效。只要你在日常工作中多用、多记、多总结,这些命令很快就能成为你的肌肉记忆。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询