本文将从核心概念→高频命令→学习步骤→实战案例→排障场景模拟→测试应用思考 六个维度,系统掌握测试排障所需的 Linux 核心技能。

一、核心概念梳理

模块 核心概念
进程管理 进程是程序的运行实例(有唯一 PID),CPU / 内存资源被进程占用,进程异常会导致服务不可用
systemd 服务 服务是常驻后台的进程(守护进程),systemd 是 Linux 主流的服务管理框架,统一管理服务生命周期
网络管理 端口是进程与网络交互的 “入口”(如 80 对应 nginx),网络不通 / 端口占用会导致服务无法访问
日志排查 日志是服务 / 系统的 “运行日记”,包含报错、警告、运行状态,是定位问题的核心依据

二、高频命令速查表(测试排障必备)

1. 进程管理命令

命令 作用 高频用法示例
ps aux 静态查看所有进程(BSD 格式) `ps aux grep nginx`(查找 nginx 进程)
ps -ef 静态查看所有进程(System V 格式) `ps -ef grep java`(查找 java 进程)
top 动态查看进程资源占用(实时刷新) 直接输入top,按P按 CPU 排序、M按内存排序
kill [PID] 终止指定 PID 的进程(默认 SIGTERM 信号) kill 1234(终止 PID=1234 的进程)
kill -9 [PID] 强制终止进程(SIGKILL 信号,无法拦截) kill -9 1234(强制杀进程)
pkill [进程名] 按进程名终止进程 pkill nginx(终止所有 nginx 进程)
pidof [进程名] 查看指定进程的 PID pidof nginx(输出 nginx 的 PID 列表)

2. systemd 服务管理命令

命令 作用 高频用法示例
systemctl start [服务名] 启动服务 systemctl start nginx
systemctl stop [服务名] 停止服务 systemctl stop nginx
systemctl restart [服务名] 重启服务 systemctl restart nginx
systemctl status [服务名] 查看服务状态(核心排障命令) systemctl status nginx
systemctl enable [服务名] 设置服务开机自启 systemctl enable nginx
systemctl disable [服务名] 关闭服务开机自启 systemctl disable nginx
systemctl daemon-reload 重载服务配置文件(修改配置后执行) systemctl daemon-reload
journalctl -u [服务名] 查看服务专属日志 journalctl -u nginx -f(实时查看)
journalctl -u [服务名] --since "10min ago" 查看最近 10 分钟的服务日志 journalctl -u nginx --since "10min ago"

3. 网络管理命令

命令 作用 高频用法示例
ip addr 查看本机 IP 地址 ip addr(替代旧命令 ifconfig)
ss -tulnp 查看端口占用(核心!t=TCP,u=UDP,l = 监听,n = 端口号,p = 进程) `ss -tulnp grep 80`(查 80 端口占用)
ping [IP/域名] 测试网络连通性 ping baidu.com
telnet [IP] [端口] 测试端口是否可访问 telnet 192.168.1.100 80
nc -zv [IP] [端口] 替代 telnet 测试端口(更友好) nc -zv 192.168.1.100 8080
firewall-cmd --list-ports 查看防火墙开放的端口 firewall-cmd --list-ports
firewall-cmd --add-port=80/tcp --permanent 永久开放 80 端口 firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --reload

4. 日志排查命令

命令 作用 高频用法示例
tail -f [日志文件] 实时查看日志(核心!测试排障必备) tail -f /var/log/nginx/error.log
grep [关键词] [日志文件] 过滤日志中的关键词 grep "error" /var/log/nginx/error.log
grep -n [关键词] [日志文件] 显示关键词所在行号 grep -n "timeout" /var/log/app.log
grep -A5 -B5 [关键词] 显示关键词前后 5 行(上下文) grep -A5 -B5 "Exception" app.log
awk '{print $1,$4}' 提取日志指定列 `cat access.log awk '{print $1,$7}'`(提取 IP 和访问路径)
sed -n '100,200p' [日志] 查看日志第 100-200 行 sed -n '100,200p' app.log
`cat [日志] wc -l` 统计日志行数 `grep "error" app.log wc -l`(统计错误数)

三、分模块

1. 进程管理

步骤 1:掌握 ps 命令(静态查进程)
  • 执行ps aux,理解输出列含义:
    • USER:进程所属用户
    • PID:进程 ID(核心)
    • %CPU:CPU 占用率
    • %MEM:内存占用率
    • COMMAND:进程启动命令
  • 实战:ps aux | grep nginx → 过滤出 nginx 相关进程,确认是否运行。
步骤 2:掌握 top 命令(动态查资源)
  • 输入top,熟悉交互操作:
    • P:按 CPU 占用率从高到低排序
    • M:按内存占用率从高到低排序
    • k:输入 PID 终止进程
    • q:退出 top
  • 实战:用 top 找到 CPU 占用 100% 的进程,记录 PID。
步骤 3:掌握 kill 命令(终止异常进程)
  • 先尝试温和终止:kill [PID]
  • 若无效,强制终止:kill -9 [PID]
  • 实战:终止步骤 2 中找到的高 CPU 进程,再用 top 验证是否消失。

2. systemd 服务管理学习步骤

步骤 1:基础启停操作
  • 以 nginx 为例,执行:
    systemctl start nginx    # 启动
    systemctl status nginx   # 查看状态(正常会显示active (running))
    systemctl restart nginx  # 重启
    systemctl stop nginx     # 停止
    
步骤 2:开机自启配置
  • 配置开机自启:systemctl enable nginx
  • 验证:systemctl is-enabled nginx(输出 enabled 则成功)
  • 关闭自启:systemctl disable nginx
步骤 3:服务日志排查
  • 实时查看 nginx 日志:journalctl -u nginx -f
  • 查看最近 30 分钟的日志:journalctl -u nginx --since "30min ago"
  • 实战:故意修改 nginx 配置文件(如删除分号),执行systemctl restart nginx,用systemctl status nginxjournalctl -u nginx查看报错。

3. 网络管理学习步骤

步骤 1:查 IP 和端口
  • 查本机 IP:ip addr(找到 inet 开头的行,如 192.168.1.100)
  • 查端口占用:ss -tulnp | grep 80 → 输出如LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6)),说明 80 端口被 nginx(PID=1234)占用。
步骤 2:测试连通性
  • 测试 IP 连通:ping 192.168.1.100(丢包率 0% 则连通)
  • 测试端口连通:telnet 192.168.1.100 80(显示 Connected 则端口通)
  • 替代方案(无 telnet 时):nc -zv 192.168.1.100 80
步骤 3:防火墙配置
  • 查看开放端口:firewall-cmd --list-ports
  • 临时开放 8080 端口(重启失效):firewall-cmd --add-port=8080/tcp
  • 永久开放 8080 端口:firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload

4. 日志排查学习步骤

步骤 1:实时查看日志
  • 以 nginx 错误日志为例:tail -f /var/log/nginx/error.log,此时操作 nginx(如访问不存在的页面),日志会实时输出。
步骤 2:关键词过滤
  • 查找所有错误:grep "error" /var/log/nginx/error.log
  • 查找错误并显示行号:grep -n "error" /var/log/nginx/error.log
  • 查找错误并显示前后 3 行:grep -A3 -B3 "error" /var/log/nginx/error.log
步骤 3:日志提取与统计
  • 从 nginx 访问日志提取所有访问 IP:cat /var/log/nginx/access.log | awk '{print $1}'
  • 统计每个 IP 的访问次数:cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
  • 实战:从应用日志中统计 “Timeout” 报错的次数:grep "Timeout" app.log | wc -l

四、模拟排障场景(测试核心)

场景 1:nginx 服务启动失败

问题现象

执行systemctl start nginx后,systemctl status nginx显示failed (exit code: 1)

排障步骤
  1. 查看服务状态
    systemctl status nginx
    # 输出示例:nginx: [emerg] invalid number of arguments in "listen" directive in /etc/nginx/nginx.conf:80
    
  2. 查看详细日志
    journalctl -u nginx --since "5min ago"
    # 进一步确认报错行和原因(如配置文件语法错误)
    
  3. 定位配置文件错误
    nginx -t  # 验证配置文件语法(核心!会直接指出错误行)
    # 输出示例:nginx: [emerg] invalid number of arguments in "listen" directive in /etc/nginx/nginx.conf:80
    
  4. 修复配置文件
    • 编辑/etc/nginx/nginx.conf,修正第 80 行的 listen 指令(如补充端口号)。
  5. 验证修复
    nginx -t  # 显示nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    systemctl start nginx
    systemctl status nginx  # 显示active (running)
    

场景 2:端口占用导致服务无法启动

问题现象

启动 tomcat(默认 8080 端口)时失败,日志显示Address already in use

排障步骤
  1. 查找占用 8080 端口的进程
    ss -tulnp | grep 8080
    # 输出示例:LISTEN 0 128 *:8080 *:* users:(("java",pid=5678,fd=10))
    # 说明8080端口被PID=5678的java进程占用
    
  2. 确认进程用途(可选):
    ps -ef | grep 5678
    # 查看进程对应的服务(如旧的tomcat实例)
    
  3. 终止占用进程
    kill -9 5678  # 强制终止
    
  4. 重启服务
    systemctl start tomcat
    systemctl status tomcat  # 确认启动成功
    
  5. 预防措施(可选):修改 tomcat 端口为 8081,或配置服务依赖确保旧进程先停止。

五、测试工作中的应用思考

1. 服务启动失败怎么查?

  • 第一步:systemctl status [服务名] → 快速看状态和关键报错;
  • 第二步:journalctl -u [服务名] -f → 实时查看服务日志;
  • 第三步:若日志无明确报错,排查资源(top看 CPU / 内存)、端口(ss -tulnp看端口占用)、配置文件(如 nginx -t 验证语法)。

2. 接口报错怎么查?

  • 第一步:确定接口对应的服务(如 /user 接口对应 user-service);
  • 第二步:实时查看服务日志:tail -f /var/log/user-service/app.log
  • 第三步:过滤关键词:grep "user接口" app.loggrep "500" app.log(500 是服务器内部错误);
  • 第四步:提取报错上下文:grep -A10 -B10 "Exception" app.log,定位代码行或数据库问题。

3. 性能瓶颈怎么查?

  • CPU 瓶颈:top按 P 排序,找到高 CPU 进程,结合ps -ef看进程用途;
  • 内存瓶颈:top按 M 排序,若内存占用过高,查看是否有内存泄漏;
  • 网络瓶颈:ping测试延迟、ss -tulnp看端口是否堵塞、iftop(需安装)看网络流量;
  • 日志佐证:查找日志中的 “timeout”“slow query”(慢查询)关键词,定位性能卡点。

六、总结

关键点回顾
  1. 进程排查ps aux/top查进程,kill -9终止异常进程,核心是定位高资源占用的 PID;
  2. 服务管理systemctl启停 / 自启服务,journalctl -u查服务日志,nginx -t验证配置语法是排障关键;
  3. 网络排查ss -tulnp查端口占用,telnet/nc测试端口连通,防火墙端口开放是测试环境常见卡点;
  4. 日志排查tail -f实时看日志,grep -A/-B查报错上下文,awk提取关键信息,是测试排障的核心工具。

核心原则

测试排障的核心是 “先定位范围(进程 / 服务 / 网络 / 日志)→ 再精准排查(用对应命令)→ 最后验证修复”。

七、实战案例中排查端口占用的具体步骤

端口占用是测试排障中最常见的网络问题,以下是标准化、可落地的排查步骤,以 “8080 端口被占用导致 tomcat 启动失败” 为例:

步骤 1:明确待排查的端口号

先从报错日志 / 服务配置中确认目标端口,比如:

  • tomcat 启动日志显示Address already in use (8080) → 目标端口是 8080;
  • 也可从服务配置文件确认:cat /usr/local/tomcat/conf/server.xml | grep "Connector port" → 输出8080
步骤 2:查找占用该端口的进程(核心)

使用ss -tulnp(推荐,比 netstat 更高效)精准定位:

# 通用格式:ss -tulnp | grep 端口号
ss -tulnp | grep 8080

输出示例

LISTEN 0      128         *:8080              *:*    users:(("java",pid=5678,fd=10))
  • 关键信息解读:
    • LISTEN:端口处于 “监听状态”(已被占用);
    • java:占用端口的进程名;
    • pid=5678:占用端口的进程 PID(核心标识)。
步骤 3:验证进程的合法性(可选但重要)

避免误杀关键进程,需确认该进程的用途:

# 方式1:通过PID查进程详情
ps -ef | grep 5678
# 输出示例:tomcat  5678  1  0 10:00 ?  00:00:05 /usr/local/java/bin/java -jar old-tomcat.jar

# 方式2:查看进程的启动目录(进阶)
ls -l /proc/5678/cwd  # 输出进程的工作目录,确认是“旧tomcat实例”
步骤 4:处理占用进程(根据场景选择)
场景 处理方式 命令示例
进程是 “无效 / 旧实例” 强制终止进程(测试环境常用) kill -9 5678
进程是 “核心服务” 改目标服务的端口(如 tomcat 改 8081) 修改 tomcat 的 server.xml
需临时释放端口 临时停止占用进程(保留进程数据) systemctl stop old-tomcat
步骤 5:验证端口是否释放
# 再次查询端口,无输出则已释放
ss -tulnp | grep 8080

# 补充:测试端口是否可监听
nc -zv 127.0.0.1 8080  # 输出“Connection refused”说明端口已释放
步骤 6:重启目标服务并验证
systemctl start tomcat
systemctl status tomcat  # 显示active (running)则成功

二、Linux 防火墙规则配置(firewalld 为主,兼容 iptables)

Linux 主流防火墙是firewalld(CentOS7+/RHEL7+),旧版iptables仍有使用,以下是高频配置场景

核心前提

先确认防火墙状态:

# 查看firewalld状态
systemctl status firewalld
# 启动防火墙(若未运行)
systemctl start firewalld && systemctl enable firewalld
场景 1:开放指定端口(测试环境最常用)
配置类型 命令(firewalld) 说明
临时开放 firewall-cmd --add-port=8080/tcp 重启防火墙后失效(测试用)
永久开放 firewall-cmd --add-port=8080/tcp --permanent 需重载规则才生效

完整流程

# 1. 永久开放8080端口(TCP协议)
firewall-cmd --add-port=8080/tcp --permanent

# 2. 重载规则(使永久配置生效)
firewall-cmd --reload

# 3. 验证是否开放
firewall-cmd --list-ports  # 输出包含8080/tcp则成功
场景 2:关闭已开放的端口
# 1. 永久关闭8080端口
firewall-cmd --remove-port=8080/tcp --permanent

# 2. 重载规则
firewall-cmd --reload

# 3. 验证
firewall-cmd --list-ports  # 无8080/tcp则成功
场景 3:开放指定 IP 的访问权限
# 允许192.168.1.100访问本机80端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="80" accept' --permanent

# 重载并验证
firewall-cmd --reload
firewall-cmd --list-rich-rules
场景 4:旧版 iptables 配置(备用)

若系统用 iptables(CentOS6-):

# 开放80端口(临时)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 保存规则(永久)
service iptables save

# 查看规则
iptables -L -n

三、除文中提到的常用网络管理命令

命令 核心作用 高频用法示例(测试排障)
netstat 旧版端口 / 连接查看(兼容老系统) `netstat -tulnp grep 80`(替代 ss)
iftop 实时监控网络流量(定位带宽占用) iftop -i eth0(监控 eth0 网卡流量)
tcpdump 网络抓包(定位接口 / 协议层问题) tcpdump -i eth0 port 8080 -w /tmp/packet.pcap(抓取 8080 端口数据包)
route 查看 / 配置路由表(排查跨网段不通) route -n(查看路由表,找默认网关)
nslookup DNS 解析测试(排查域名访问失败) nslookup baidu.com(验证域名解析是否正常)
dig 更详细的 DNS 解析(比 nslookup 强) dig www.taobao.com(查看 DNS 解析全过程)
traceroute 路由追踪(定位网络不通的节点) traceroute 192.168.2.100(看数据包到目标 IP 的路径)
mtr 结合 ping+traceroute(更精准) mtr baidu.com(实时显示每跳的丢包率 / 延迟)
ethtool 查看网卡状态(排查硬件 / 链路问题) ethtool eth0(查看网卡速率、是否连接)
curl 测试 HTTP 接口(替代浏览器) curl -X POST http://127.0.0.1:8080/api/user -d "id=1"
wget 测试 URL 可达性(后台下载) wget http://127.0.0.1:8080(测试服务是否返回内容)

总结

关键点回顾
  1. 端口占用排查:先确认端口号 → 用ss -tulnp找 PID → 验证进程合法性 → 终止 / 改端口 → 验证释放;
  2. 防火墙配置:firewalld 优先,临时规则用于测试,永久规则需--permanent + reload,核心是 “开放 / 关闭端口 + 验证”;
  3. 补充网络命令tcpdump抓包、mtr路由追踪、curl接口测试是测试排障的进阶利器,可定位协议层 / 链路层问题。

核心原则:网络问题排查遵循 “从应用层(端口)→ 网络层(路由)→ 链路层(网卡)” 的顺序,先定位范围再精准排查。

八、实战案例中处理进程的具体方法

一、处理进程前,必须先做 2 步(防误杀)

不管要杀什么进程,先确认身份,再处理

  1. 查进程 PID
    ps aux | grep 进程名
    # 或
    pidof 进程名
    
  2. 确认这是要处理的目标进程(不是系统进程、不是其他业务)

二、实战 4 种处理进程的具体方法

1)温和终止(推荐优先用)

给进程正常退出的机会,适合大部分服务。

kill PID
  • 信号:SIGTERM(15)
  • 特点:安全、会释放资源、写日志
  • 适用:正常停止、服务重启
2)强制杀死(杀不死时用)

进程卡死、无响应、端口占住不放时用。

kill -9 PID
  • 信号:SIGKILL(9)
  • 特点:立刻销毁进程,不写日志、不清理资源
  • 适用:端口占用、CPU / 内存飙高、服务僵死
3)按名字批量杀死(不用查 PID)

适合同一类进程有多个的情况(如 Java、Nginx)。

pkill 进程名
# 或
killall 进程名

示例:

pkill nginx
pkill java
4)服务托管的进程:不要直接 kill!

由 systemd 管理的服务(nginx、tomcat、mysql),优先用 systemctl

systemctl stop 服务名
  • 直接 kill 可能导致:
    • 服务被 systemd 自动拉起
    • 状态异常
    • 日志不完整

三、直接套用到之前的 2 个实战案例

案例 1:Nginx 启动失败 / 异常
  1. 查进程
    ps aux | grep nginx
    pidof nginx
    
  2. 处理方法
    # 方法1:服务方式停(推荐)
    systemctl stop nginx
    
    # 方法2:批量杀
    pkill nginx
    
    # 方法3:强制杀某个PID
    kill -9 1234
    
案例 2:端口占用(如 8080 被占)
  1. 先通过端口找到 PID
    ss -tulnp | grep 8080
    
  2. 拿到 PID 后处理
    # 优先温和
    kill 5678
    
    # 温和无效 → 强制
    kill -9 5678
    
  3. 验证端口是否释放
    ss -tulnp | grep 8080
    

总结:测试排障固定套路

  1. 看状态 / 日志 → 确定异常进程
  2. ps / top / ss 找到 PID
  3. 优先:
    • systemctl stop(服务)
    • kill PID(普通进程)
  4. 无效再用:
    • kill -9 PID
    • pkill 进程名
  5. 最后验证:进程没了、端口释放
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐