Linux进程、服务、网络管理与日志排查
进程排查ps auxtop查进程,kill -9终止异常进程,核心是定位高资源占用的 PID;服务管理systemctl启停 / 自启服务,查服务日志,nginx -t验证配置语法是排障关键;网络排查ss -tulnp查端口占用,telnet/nc测试端口连通,防火墙端口开放是测试环境常见卡点;日志排查tail -f实时看日志,grep -A/-B查报错上下文,awk提取关键信息,是测试排障的核心
本文将从核心概念→高频命令→学习步骤→实战案例→排障场景模拟→测试应用思考 六个维度,系统掌握测试排障所需的 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 nginx和journalctl -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)。
排障步骤
- 查看服务状态:
systemctl status nginx # 输出示例:nginx: [emerg] invalid number of arguments in "listen" directive in /etc/nginx/nginx.conf:80 - 查看详细日志:
journalctl -u nginx --since "5min ago" # 进一步确认报错行和原因(如配置文件语法错误) - 定位配置文件错误:
nginx -t # 验证配置文件语法(核心!会直接指出错误行) # 输出示例:nginx: [emerg] invalid number of arguments in "listen" directive in /etc/nginx/nginx.conf:80 - 修复配置文件:
- 编辑
/etc/nginx/nginx.conf,修正第 80 行的 listen 指令(如补充端口号)。
- 编辑
- 验证修复:
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。
排障步骤
- 查找占用 8080 端口的进程:
ss -tulnp | grep 8080 # 输出示例:LISTEN 0 128 *:8080 *:* users:(("java",pid=5678,fd=10)) # 说明8080端口被PID=5678的java进程占用 - 确认进程用途(可选):
ps -ef | grep 5678 # 查看进程对应的服务(如旧的tomcat实例) - 终止占用进程:
kill -9 5678 # 强制终止 - 重启服务:
systemctl start tomcat systemctl status tomcat # 确认启动成功 - 预防措施(可选):修改 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.log或grep "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”(慢查询)关键词,定位性能卡点。
六、总结
关键点回顾
- 进程排查:
ps aux/top查进程,kill -9终止异常进程,核心是定位高资源占用的 PID; - 服务管理:
systemctl启停 / 自启服务,journalctl -u查服务日志,nginx -t验证配置语法是排障关键; - 网络排查:
ss -tulnp查端口占用,telnet/nc测试端口连通,防火墙端口开放是测试环境常见卡点; - 日志排查:
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(测试服务是否返回内容) |
总结
关键点回顾
- 端口占用排查:先确认端口号 → 用
ss -tulnp找 PID → 验证进程合法性 → 终止 / 改端口 → 验证释放; - 防火墙配置:firewalld 优先,临时规则用于测试,永久规则需
--permanent + reload,核心是 “开放 / 关闭端口 + 验证”; - 补充网络命令:
tcpdump抓包、mtr路由追踪、curl接口测试是测试排障的进阶利器,可定位协议层 / 链路层问题。
核心原则:网络问题排查遵循 “从应用层(端口)→ 网络层(路由)→ 链路层(网卡)” 的顺序,先定位范围再精准排查。
八、实战案例中处理进程的具体方法
一、处理进程前,必须先做 2 步(防误杀)
不管要杀什么进程,先确认身份,再处理:
- 查进程 PID
ps aux | grep 进程名 # 或 pidof 进程名 - 确认这是要处理的目标进程(不是系统进程、不是其他业务)
二、实战 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 启动失败 / 异常
- 查进程
ps aux | grep nginx pidof nginx - 处理方法
# 方法1:服务方式停(推荐) systemctl stop nginx # 方法2:批量杀 pkill nginx # 方法3:强制杀某个PID kill -9 1234
案例 2:端口占用(如 8080 被占)
- 先通过端口找到 PID
ss -tulnp | grep 8080 - 拿到 PID 后处理
# 优先温和 kill 5678 # 温和无效 → 强制 kill -9 5678 - 验证端口是否释放
ss -tulnp | grep 8080
总结:测试排障固定套路
- 看状态 / 日志 → 确定异常进程
ps / top / ss找到 PID- 优先:
systemctl stop(服务)kill PID(普通进程)- 无效再用:
kill -9 PIDpkill 进程名- 最后验证:进程没了、端口释放
更多推荐


所有评论(0)