CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Shell 与 Bash 入门/课时/系统管理与编辑器
RawBlame
课时目录12 节

Shell 与 Bash 入门

  1. 01Shell 是什么
  2. 02目录与文件导航
  3. 03文件操作与权限
  4. 04管道与文本处理
  5. 05变量与字符串
  6. 06条件与循环
  7. 07函数与脚本结构
  8. 08正则表达式
  9. 09进程与定时任务
  10. 10网络命令
  11. 11系统管理与编辑器
  12. 12综合练习

系统管理与编辑器

apt/brew、vim、ShellCheck。

30 分钟

系统管理与编辑器

这一课你将能做到

  1. 用 df / du / free / uptime 一套命令完成服务器「体检」,定位磁盘被谁吃满
  2. 用包管理器安装运维工具,理解 systemctl 服务管理的基本动作
  3. 掌握 vim 生存技能:打开、编辑、保存、退出、搜索、紧急恢复

为什么要学

「磁盘满了」是 Java 后端最常背的锅之一:日志疯涨、MySQL 写不进、临时目录爆炸,最终都表现为应用报 IO 错误。此时需要的是一条排查链路:df 看哪个分区满 → du 找到哪个目录 → find 锁定哪个文件 → 决定删/归档/加盘。另外,vim 是服务器的「记事本」——你 SSH 上去改配置时,十有八九只有 vim 可用,连「退出」都不会的话,只能关掉整个 SSH 窗口(每个工程师都经历过这个名场面)。

人话:df 是「整个仓库还剩多少格子」,du 是「每排货架占了多少」,free 是「桌面工作台还剩多大」,vim 是「仓库里唯一的手写板」。这四样凑齐,服务器日常管理就入门了。

先建立图像

磁盘排查决策树:

df -h
  └─ 某分区 Use% 100%
       └─ cd 到该分区根 → du -h --max-depth=1 | sort -rh | head
            └─ 锁定大目录 → 步进深入
                 └─ find 目录 -type f -size +500M -exec ls -lh {} \;
                      └─ 处置:日志归档 / 临时文件删除 / 扩容

内存速读(free -h 输出):

              total   used   free   shared  buff/cache  available
Mem:           7.6G   3.1G   2.0G    100M        2.5G       4.2G
Swap:          2.0G     0B   2.0G

重点看 available(≈4.2G):真正能分配给新进程的量
free 小是正常的——Linux 把空闲内存拿去做缓存了,用的时候会还

跟着做

步骤 1:df 与 du:磁盘谁动了我的空间

df -h                          # 各分区使用率,看 Use% 列
df -h /opt                     # 只看某路径所在分区
df -i                          # inode 使用率(小文件海啸会打爆它)

mkdir -p ~/sys-lab/big && cd ~/sys-lab
dd if=/dev/zero of=big/fake.log bs=1M count=50    # 造个 50MB 假日志
du -sh ~/sys-lab               # 这个目录总共多大
du -h --max-depth=1 ~ 2>/dev/null | sort -rh | head   # 家目录下谁最大
find ~/sys-lab -type f -size +10M -exec ls -lh {} \;  # 锁定大文件
rm big/fake.log                                   # 确认后删除

dd 在这里只是造测试文件的工具;du --max-depth=1 + sort -rh 是「磁盘抢劫案」的标准破案组合。

步骤 2:free 与 uptime:内存与负载

free -h                  # 看available,别被 free 列吓到
uptime                   # 负载 + 开机时长:load 超过 CPU 核数即过载
nproc                    # CPU 核数,load 是否超标用它与它比

判断口诀:available 低于总内存 10% 要警觉(JVM 容易被 OOM killer 选中);load 持续 > 核数要排查(配合 top 的 us/sy/wa 定位)。

步骤 3:lsof:谁在用这个文件/端口

lsof -i :8000            # 谁占着 8000 端口(上一课起的 python 服务)
lsof ~/net-lab/server.log 2>/dev/null   # 谁打开着这个日志文件
lsof | grep deleted | head              # 已删除但仍被占用的文件(磁盘没释放元凶)

「rm 了 3GB 日志但 df 不降」就是这个场景:进程还握着文件句柄,空间要到进程关闭才释放。临时解法 : > 大日志文件(清空而非删除),治本是重启或轮转日志。

步骤 4:包管理器装工具

# Ubuntu/Debian
sudo apt update
sudo apt install -y tree jq htop

# CentOS/RHEL
# sudo yum install -y tree jq htop

# 验证
tree --version && jq --version
echo '{"name":"app","port":8080}' | jq .name    # 输出 "app"

jq 是命令行 JSON 处理器,解析 Spring Boot Actuator 响应、云 API 返回值非常顺手;htop 是 top 的彩色增强版。

步骤 5:systemctl:正规军的服务管理

systemctl status nginx          # 看服务状态(运行中/失败/最近日志片段)
sudo systemctl start nginx      # 启动
sudo systemctl stop nginx       # 停止
sudo systemctl restart nginx    # 重启(改完配置后)
sudo systemctl reload nginx     # 平滑重载(不断连接,优先用)
sudo systemctl enable nginx     # 开机自启
systemctl list-units --type=service --state=running | head   # 列出运行中的服务

对比第 9 课的 nohup:nohup 是「自己拿绳子拴住进程」,systemd 是「有编制的服务」——开机自启、崩溃自动拉起、日志进 journal。生产应用应该 systemd 化。

# 看某个服务的最近日志(journal 是 systemd 的日志中心)
journalctl -u nginx -n 20 --no-pager

步骤 6:vim 生存十式

vim ~/sys-lab/note.txt

按下面顺序练,练完你就「活下来」了:

模式理解:vim 打开=普通模式(不能打字!)
i          进入插入模式,开始打字
Esc        回到普通模式
:wq        保存退出(write & quit)
:q!        不保存强退(改错了就这个)
dd         删除(剪切)当前行
yy         复制当前行    p 粘贴到下一行
u          撤销          Ctrl+r 重做
/ERROR     向下搜索,n 下一个,N 上一个
gg / G     跳到文件头 / 文件尾
:set nu    显示行号(排查配置时配合行号定位)

配置增强:echo "set nu" >> ~/.vimrc 让行号永久显示。公司服务器只装了 vi 时,以上命令全部通用。

步骤 7:综合演练:一次「磁盘告警」处置

# 1. 复现场景:把一个分区弄紧张(这里用家目录演示思路)
dd if=/dev/zero of=~/sys-lab/disk-filler.bin bs=1M count=200

# 2. 告警到位:哪个分区
df -h ~

# 3. 定位目录
du -h --max-depth=1 ~ | sort -rh | head -5

# 4. 锁定文件
find ~/sys-lab -type f -size +100M -exec ls -lh {} \;

# 5. 处置(演示用文件,直接删;真实日志先 gzip 归档)
gzip ~/sys-lab/some.log 2>/dev/null; rm ~/sys-lab/disk-filler.bin

# 6. 复核
df -h ~

这六步就是值班时磁盘告警的标准作业流程(SOP),第 12 课会把它写成可复用的脚本。

讲清楚要点

  1. free 的 available 才是可分配内存:buff/cache 是内核拿空闲内存做的文件缓存,应用需要时立即归还。「free 很小 = 内存不足」是经典误判。
  2. inode 和空间是两种资源:df -h 还有空间但写文件报 No space left on device,大概率 df -i 的 inode 用满了——海量小文件(邮件队列、session 文件)是典型元凶。
  3. systemctl 区分 start 与 enable:start 是「现在跑起来」,enable 是「开机也跑起来」。新装服务两件事都要做,漏 enable 重启后服务消失是常见事故。
  4. reload 优先于 restart:Nginx 的 reload 平滑加载新配置不断连接,restart 会中断存量连接。改配置后的标准动作:nginx -t && systemctl reload nginx。
  5. vim 的普通模式是「命令模式」:所有编辑动作(dd/yy/p/u/搜索)都在普通模式发令,按 i 才进输入。分不清模式是「vim 退出不了」的根因,Esc 先回普通模式再想下一步。
  6. 改配置文件前先备份:cp nginx.conf nginx.conf.bak.$(date +%F),一行命令换回滚保险。配合第 3 课的软链接思路,配置变更也能做成可回滚的。

你可能会懵的地方

  • swap 是什么,它有值正常吗? 磁盘上的一块「备用内存」,物理内存紧张时把不活跃页换出去。used 长期不为 0 说明内存曾紧张过;频繁换入换出(si/so 持续非零)会让 Java 应用卡顿明显——JVM 堆被换出到磁盘是性能灾难,此时该加内存或调小堆。

  • 为什么 du 统计的大小和 df 显示的对不上? 两个常见原因:① 已删除但被进程占用的文件(du 看不到,df 算在内),lsof | grep deleted 揪出;② 挂载点下的隐藏占用,df 按文件系统算,du 按目录树算。对不上时优先怀疑前者。

  • yum 和 apt 装的软件都去哪了? 二进制进 /usr/bin 或 /usr/sbin,配置进 /etc,文档进 /usr/share,且登记进 rpm/dpkg 数据库。dpkg -L 软件名(Debian 系)或 rpm -ql 软件名(RHEL 系)列出全部安装文件,找配置文件位置很好用。

  • vim 里粘贴代码格式全乱了怎么办? 自动缩进在捣乱。粘贴前 :set paste,贴完 :set nopaste 恢复。这是「从 IDE 拷配置到服务器」的高频翻车点。

  • journalctl 日志太多怎么过滤? journalctl -u 服务名 --since "10 min ago" --no-pager 看最近十分钟;-p err 只看错误级别;-f 实时跟踪。journal 是二进制存储,grep 之前先过 journalctl 的过滤参数。

错法对照

错法问题正解
看到 free 小就断定内存不足buff/cache 会自动归还看 available 与 swap 活动
vim 里打不出字就乱按模式混乱,可能触发危险命令先按 Esc 回普通模式再操作
改完配置直接 restart中断存量连接nginx -t && systemctl reload
磁盘满就 rm 正在写的日志空间不释放(句柄未关): > 文件 清空或重启写方进程
新服务只 start 不 enable重启服务器后服务失踪start + enable 一步不落

卡点急救

  1. vim 卡住退不出:Esc → 依次尝试 :q!、:wq、ZZ。若终端显示异常(乱码/无回显),试 Ctrl+q(可能误按了 Ctrl+s 冻结了输出流)。
  2. No space left on device 但 df -h 有空间:查 df -i 是否 inode 满;满则 find 小文件聚集目录(如 /var/spool),批量清理后 inode 释放。
  3. 误删了大文件但磁盘没腾出来:lsof | grep deleted 找到占用进程;能重启就重启,不能重启且是日志文件可 : > /proc/PID/fd/N 释放对应句柄空间(谨慎,需确认 fd 对应关系)。

面试常问

  • 磁盘使用率告警,你的排查和处理流程? ① df -h 找满的分区;② du -h --max-depth=1 | sort -rh 逐层下钻锁定大目录;③ find -type f -size +500M 定位具体文件;④ 分类处置——日志 gzip 归档或清理、临时文件删除、已删未释放的用 lsof | grep deleted 处理;⑤ 复核 df,并把日志轮转(logrotate)补上防止复发。答出「防复发」环节是加分项。

  • 服务器负载高但 CPU 使用率不高,可能是什么问题? load 统计的是「运行中 + 不可中断等待」的任务数。CPU 不高但 load 高,通常是 D 状态进程在等 IO——wa 高、磁盘慢(日志/MySQL 疯狂读写、NFS 卡住)。验证:top 看 wa,ps aux | awk '$8~/D/' 找 D 状态进程,iostat 看磁盘利用率。这是区分「算力瓶颈」和「IO 瓶颈」的经典题。

  • Linux 下 vim 怎么快速完成一次配置修改? 标准路径:vim /etc/nginx/nginx.conf → /关键字 搜索定位 → i 编辑 → Esc → :wq 保存 → nginx -t 验证语法 → systemctl reload nginx 生效。能带上「先备份、改后验证」就超出平均水平。

自测三问

  1. free -h 里最应该关注哪一列?为什么?
  2. df 显示有空间但创建文件报错,可能是什么资源耗尽?
  3. 写出「找到 /var/log 下 100MB 以上文件并列出大小」的命令。

小结一句话

系统管理就是会体检、会开药:df/du/free/uptime 体检,lsof 找病灶,systemctl 管服务,vim 改病历——四个磁盘排查命令 + 十个 vim 按键,服务器日常就运转起来了。

延伸

  • systemd 官方文档
  • 下一课:综合练习——把全 Track 的技能组装成备份、巡检、日志分析三套实战脚本。
加载本节练习…
← 上一课网络命令下一课 →综合练习