Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
对于后端开发来说,线上服务出问题,第一战场就是 Linux 服务器。CPU 飙升、磁盘爆满、进程异常退出、端口占用、接口报错,绝大多数问题都要依靠 Linux 命令快速定位。 本文聚焦后端开发实战,讲解 Linux 标准目录结构,吃透 6 个高频排查命令,梳理一套标准化故障排查流程,同时讲解 Bash Shell 基础语法,附带可直接部署的 Java 服务监控脚本,兼顾日常工作使用与面试复习。
前言
Linux 采用单根树文件系统,根目录/是整个文件系统的起点,所有文件、硬件设备都挂载在这棵目录树下,和 Windows 的多盘符结构完全不同。后端开发不用像运维那样精通内核调优,但必须熟悉目录含义、掌握基础排查命令,还可以通过简单 Shell 脚本实现服务自动化巡检。
一、Linux 核心目录结构(重点)
遵循 FHS 文件系统层次标准,下面只列出后端日常开发最常用目录:
| 目录 | 作用说明 |
|---|---|
/ | 根目录,整个文件系统起点 |
/etc | 系统配置目录。存放服务配置、环境变量、自定义 systemd 服务。例:/etc/profile环境变量,/etc/hosts域名解析 |
/home | 普通用户家目录,/home/用户名,存放业务脚本、个人文件 |
/root | root 管理员家目录,普通用户无访问权限 |
/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"
三、线上故障标准排查流程
top:检查 CPU、内存负载df -h:确认磁盘是否打满ps -ef | grep java:确认业务进程是否存在netstat -lntp | grep 8080:确认端口监听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 不一样,脚本中路径尽量写绝对路径,避免手动执行正常,定时执行失败。
五、踩坑汇总
- df 看到磁盘满,但找不到大文件:文件被进程占用,删除后句柄未释放,重启对应进程。
- netstat 命令不存在:最小化系统没有 net-tools,
yum install net-tools安装。 - 日志切割后 tail -f 停止输出,改用 tail -F。
- 权限不足:查看进程、端口、日志需要 root 或者文件所属用户,可加 sudo。
- Windows 编辑器写脚本上传 Linux,
\r换行符报错:使用dos2unix转换换行。 if [ ]语法报错:括号前后缺少空格。- 变量引用不加双引号,变量为空时脚本异常。
- 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 脚本实现自动化巡检,就可以处理线上绝大多数服务异常。哪怕在微服务、容器化时代,这套底层排查思路依旧是后端核心硬技能。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)