对于后端开发来说,线上服务出问题,第一战场就是 Linux 服务器。CPU 飙升、磁盘爆满、进程异常退出、端口占用、接口报错,绝大多数问题都要依靠 Linux 命令快速定位。 本文聚焦后端开发实战,讲解 Linux 标准目录结构,吃透 6 个高频排查命令,梳理一套标准化故障排查流程,同时讲解 Bash Shell 基础语法,附带可直接部署的 Java 服务监控脚本,兼顾日常工作使用与面试复习。

前言

Linux 采用单根树文件系统,根目录/是整个文件系统的起点,所有文件、硬件设备都挂载在这棵目录树下,和 Windows 的多盘符结构完全不同。后端开发不用像运维那样精通内核调优,但必须熟悉目录含义、掌握基础排查命令,还可以通过简单 Shell 脚本实现服务自动化巡检。

一、Linux 核心目录结构(重点)

遵循 FHS 文件系统层次标准,下面只列出后端日常开发最常用目录:

目录作用说明
/根目录,整个文件系统起点
/etc系统配置目录。存放服务配置、环境变量、自定义 systemd 服务。例:/etc/profile环境变量,/etc/hosts域名解析
/home普通用户家目录,/home/用户名,存放业务脚本、个人文件
/rootroot 管理员家目录,普通用户无访问权限
/var可变运行数据目录。重点:/var/log系统日志目录;/var/run进程 PID 文件
/usr系统软件、命令库。/usr/local推荐用来部署第三方业务程序
/tmp临时文件目录,系统重启自动清空,适合临时缓存
/dev设备文件,磁盘、网卡等硬件设备
/proc虚拟文件系统,不占用磁盘,保存内核与进程实时信息,top、ps 读取这里的数据
/opt大型第三方商业软件安装目录

最佳实践:业务程序部署在/usr/local,日志单独挂载磁盘,不要往根目录大量写入日志,一旦根磁盘打满,会直接导致系统崩溃。

二、六大核心排查命令(高频)

标准排查思路

资源检查 → 进程检查 → 端口检查 → 日志定位

1. top:实时监控 CPU、内存、进程

作用:动态实时查看系统负载,定位高 CPU、高内存占用进程,Java 服务 CPU 打满首选。

top

快捷键:

  • P:按 CPU 排序
  • M:按内存排序
  • 1:查看多核 CPU 每核占用
  • q:退出

关键字段:

  • %Cpu(s):CPU 使用率,us 用户态、sy 内核态、id 空闲
  • KiB Mem:物理内存统计
  • PID:进程 ID,% CPU、% MEM、COMMAND:进程启动命令

只监控 Java 进程:

top -p $(pgrep java | tr '\n' ',')

实战:top 找到高 CPU 的 PID,再用 jstack 打印线程栈定位代码死循环。

2. df:磁盘空间查看

作用:查看磁盘分区使用率,排查磁盘 100% 导致服务无法写文件、日志写入失败。

df -h

配套命令,查找大文件目录:

du -sh *

实战:df -h 发现磁盘满,使用du -sh /*逐层定位大日志文件。

3. ps:进程静态快照

作用:查看进程列表,判断业务进程是否存活。和 top 区别:top 实时刷新,ps 一次性输出快照,适合脚本使用。

ps -ef
ps aux

查找 Java 进程,排除 grep 自身:

ps -ef | grep java | grep -v grep

4. netstat:端口与 TCP 连接排查

作用:查看端口监听状态,解决端口占用问题。新版 Linux 推荐 ss,但是 netstat 面试、线上依旧大量使用。

# 查看监听端口
netstat -lntp
# 查看全部TCP连接
netstat -antp

端口占用排查:

netstat -lntp | grep 8080

注意:netstat 需要 root 权限才能看到进程名称。

5. tail:日志查看

作用:查看日志末尾,实时跟踪日志,排查线上报错。

# 查看最后10行
tail -n 10 app.log
# 实时跟踪日志
tail -f app.log
# 日志切割后仍然跟踪文件(推荐)
tail -F app.log

重点:tail -f跟踪文件描述符,日志切割后停止跟踪;tail -F跟踪文件名,日志轮转后自动继续。

6. grep:文本检索过滤日志

作用:搜索文件内容,支持正则,几乎所有排查命令都会搭配管道符|。

# 搜索ERROR
grep "ERROR" app.log
# 忽略大小写
grep -i "error" app.log
# 查看匹配行前后2行,打印异常堆栈
grep -A2 -B2 "NullPointerException" app.log

组合示例:实时日志只看错误信息

tail -f app.log | grep "ERROR"

三、线上故障标准排查流程

  1. top:检查 CPU、内存负载
  2. df -h:确认磁盘是否打满
  3. ps -ef | grep java:确认业务进程是否存在
  4. netstat -lntp | grep 8080:确认端口监听
  5. tail -f app.log | grep ERROR:查看错误日志定位根因

四、Shell 脚本基础入门,实现自动化巡检

Shell 脚本后缀一般为.sh,基于 Bash 解释器,本质就是批量执行 Linux 命令。后端开发不需要写复杂脚本,掌握变量、条件判断、循环,就可以编写巡检脚本,减少重复操作。

1. 脚本基础结构

脚本首行必须指定解释器:

#!/bin/bash
# # 代表注释
echo "Hello Shell"

脚本执行方式:

# 方式1:添加执行权限(推荐)
chmod +x demo.sh
./demo.sh

# 方式2:直接bash执行
bash demo.sh

2. 变量

定义变量,等号两侧不能有空格!

SERVICE_NAME="Java业务服务"
PID=1234
echo "服务名称:${SERVICE_NAME}"
位置参数(重点)
  • $0:脚本文件名
  • $1 $2 $3:传入脚本第 1、2、3 个参数
  • $#:传入参数总个数
  • $@:全部参数列表

示例 test.sh

#!/bin/bash
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "参数总数:$#"

执行:bash test.sh 100 200

3. if 条件判断

语法:if [ 条件 ]; then ... elif ... else ... fi ⚠️[ ]左右两侧必须保留空格,新手高频报错点。

#!/bin/bash
PID=$1
if [ -z "$PID" ]; then
    echo "请传入进程PID"
    exit 1
fi

if ps -p $PID > /dev/null; then
    echo "进程 $PID 正在运行"
else
    echo "进程 $PID 已停止"
fi

常用判断条件:

  • -z "$var":变量为空
  • -f "file":文件存在
  • -d "dir":目录存在
  • -gt大于;-lt小于;-eq等于

4. 循环 for /while

for 循环批量检查端口

#!/bin/bash
for port in 8080 8081 8082
do
    echo "检查端口 $port"
    netstat -lntp | grep $port
done

while 循环持续监控

#!/bin/bash
while true
do
    echo "=== 服务巡检 $(date) ==="
    ps -ef | grep java | grep -v grep
    sleep 5
done

5. 实战脚本:Java 服务状态监控脚本(企业可用)

文件名 service_check.sh 功能:检测 Java 进程是否存活,进程宕机输出告警,配合 crontab 定时执行。

#!/bin/bash
# 监控服务名称
SERVICE_NAME="java"
# 查找进程,过滤grep自身
PROCESS=$(ps -ef | grep $SERVICE_NAME | grep -v grep)

if [ -z "$PROCESS" ]; then
    echo "【告警】$SERVICE_NAME 服务进程已宕机!时间:$(date)"
else
    echo "【正常】$SERVICE_NAME 服务运行中"
fi

使用步骤:

# 添加执行权限
chmod +x service_check.sh
# 手动测试
./service_check.sh

6. crontab 定时任务配置

crontab 表达式:分 时 日 月 周 命令

*    *    *    *    *
分   时   日   月   周

配置每分钟执行一次巡检脚本:

crontab -e
# 添加下面一行
*/1 * * * * /root/service_check.sh

查看当前定时任务:

crontab -l

坑点:crontab 环境变量和交互式 shell 不一样,脚本中路径尽量写绝对路径,避免手动执行正常,定时执行失败。

五、踩坑汇总

  1. df 看到磁盘满,但找不到大文件:文件被进程占用,删除后句柄未释放,重启对应进程。
  2. netstat 命令不存在:最小化系统没有 net-tools,yum install net-tools安装。
  3. 日志切割后 tail -f 停止输出,改用 tail -F。
  4. 权限不足:查看进程、端口、日志需要 root 或者文件所属用户,可加 sudo。
  5. Windows 编辑器写脚本上传 Linux,\r换行符报错:使用dos2unix转换换行。
  6. if [ ]语法报错:括号前后缺少空格。
  7. 变量引用不加双引号,变量为空时脚本异常。
  8. crontab 执行脚本失败:缺少环境变量,脚本内写全文件绝对路径。

六、高频问答

Q1:top 和 ps 的区别?

A:top 实时动态刷新,持续监控资源;ps 是静态快照,一次性输出进程列表,适合脚本中获取进程信息。

Q2:df 和 du 的区别?

A:df 查看磁盘分区整体占用;du 查看单个目录 / 文件占用大小。

Q3:tail -f 和 tail -F 区别?

A:-f跟踪文件描述符,日志切割后失效;-F跟踪文件名,日志文件重建后自动继续跟踪。

Q4:脚本开头 #!/bin/bash 作用?

A:指定脚本解释器,告诉操作系统使用 bash 解析执行脚本。

Q5:管道符 | 的作用?

A:将前一个命令的标准输出作为后一个命令输入,例如ps -ef | grep java。

Q6:crontab 表达式格式?

A:分 时 日 月 周,支持*、*/n,代表每隔 n 单位执行。

结语

Linux 是后端开发的底层必备能力,不用死记所有冷门命令。

优先掌握这套故障排查链路:资源查看 → 进程检查 → 端口检查 → 日志查看。

熟练使用 top、df、ps、netstat、tail、grep 六大命令,搭配简单 Shell 脚本实现自动化巡检,就可以处理线上绝大多数服务异常。哪怕在微服务、容器化时代,这套底层排查思路依旧是后端核心硬技能。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐