一、磁盘管理进阶:让 “挂载的磁盘重启后不消失”(永久挂载)
之前学过临时挂载磁盘(比如挂载 U 盘),但重启后会失效 —— 实际工作中,服务器的磁盘需要 “永久挂载”(重启后自动挂载),就像 “家里的冰箱,每次通电都自动工作,不用重新插插头”。
1. 为什么需要永久挂载?
临时挂载(mount
命令)就像 “把 U 盘插在电脑上,拔了再插就要重新识别”;永久挂载通过配置文件让系统 “记住” 挂载信息,重启后自动挂载,适合长期使用的磁盘(如数据盘、备份盘)。
2. 永久挂载的核心:修改/etc/fstab
配置文件
/etc/fstab
是系统的 “磁盘挂载清单”,系统启动时会按这个清单自动挂载所有磁盘,就像 “超市开业前,员工按清单自动摆放货架”。
3. 实操:永久挂载 “虚拟磁盘”(以之前创建的test_disk
为例)
步骤 1:准备一个要永久挂载的磁盘 / 分区(用之前的虚拟磁盘练手)
如果之前没创建虚拟磁盘,先按以下步骤创建(模拟一个 “需要永久挂载的磁盘”):
bash
# 创建一个100MB的虚拟磁盘文件(存放在/home目录)
dd if=/dev/zero of=/home/test_disk bs=1M count=100
# 格式化虚拟磁盘为ext4格式(必须格式化才能挂载)
sudo mkfs.ext4 /home/test_disk # 提示“是否继续”输入y
步骤 2:创建挂载点(固定的 “磁盘入口”)
bash
sudo mkdir /mnt/mydisk # 创建一个固定目录作为挂载点(以后就从这访问磁盘)
步骤 3:获取磁盘的 UUID(唯一标识,比路径更可靠)
磁盘的路径(如/home/test_disk
)可能变,但 UUID(唯一识别码)永远不变,用 UUID 挂载更稳定:
bash
sudo blkid /home/test_disk # 查看虚拟磁盘的UUID
输出类似(复制UUID="..."
部分,比如UUID="a1b2c3d4-1234-5678-90ef-abcdef123456"
):
plaintext
/home/test_disk: UUID="a1b2c3d4-1234-5678-90ef-abcdef123456" TYPE="ext4"
步骤 4:修改/etc/fstab
配置文件(关键!)
bash
sudo nano /etc/fstab # 用管理员权限打开配置文件(必须sudo,否则没权限修改)
在文件末尾添加一行(粘贴你的 UUID,注意替换成实际值):
bash
# 格式:UUID=你的UUID 挂载点 文件系统类型 挂载选项 备份标识 自检顺序
UUID=a1b2c3d4-1234-5678-90ef-abcdef123456 /mnt/mydisk ext4 defaults 0 2
- 解释每行含义:
UUID=...
:磁盘的唯一标识(从blkid
获取);/mnt/mydisk
:挂载点(你创建的目录);ext4
:文件系统类型(虚拟磁盘格式化时用的 ext4);defaults
:默认挂载选项(包括可读可写等);0
:不备份(dump
工具用,一般设 0);2
:开机时自检(根分区设 1,其他分区设 2)。
步骤 5:验证配置是否正确(避免重启后系统崩溃!)
修改/etc/fstab
后一定要先验证,否则配置错误可能导致系统启动失败:
bash
sudo mount -a # 让系统重新读取fstab并挂载所有磁盘(不重启生效)
- 如果没报错:说明配置正确;
- 如果报错:检查
fstab
里的 UUID、路径是否写错(用nano /etc/fstab
修改后再试)。
步骤 6:测试 “重启后是否自动挂载”
bash
sudo reboot # 重启系统(保存好工作再执行!)
重启后登录,输入命令验证:
bash
df -h /mnt/mydisk # 查看是否挂载成功
如果显示磁盘信息(比如/home/test_disk
挂载到/mnt/mydisk
),说明永久挂载成功!
二、进程后台守护:让脚本 “关闭终端也不停”(nohup+systemd)
之前运行脚本时,一旦关闭终端,脚本就会停止 —— 实际工作中,很多任务需要长期运行(比如 “24 小时监控系统的脚本”“持续下载数据的程序”),今天学两种 “让进程在后台稳定运行” 的方法。
1. 简单方法:用 nohup 让进程 “无视终端关闭”(适合临时任务)
nohup
(no hang up,不挂断)就像 “给进程撑一把伞”,即使关闭终端,进程也能在后台继续运行,输出的日志会存到nohup.out
文件。
实操:让system_check.sh
(系统监控脚本)后台运行
步骤 1:进入linux_study
目录,确保system_check.sh
能正常运行:
bash
cd ~/linux_study
./system_check.sh # 先确认脚本没问题
步骤 2:用 nohup 启动脚本,加&
让它在后台运行:
bash
nohup ./system_check.sh > monitor.log 2>&1 &
- 逐句解释:
nohup
:让进程忽略 “终端关闭” 的信号;./system_check.sh
:要运行的脚本;> monitor.log
:把脚本的输出日志存到monitor.log
(代替默认的nohup.out
,更清晰);2>&1
:把错误信息也写到日志里(方便排查问题);&
:让进程在后台运行(终端可以继续输其他命令)。
步骤 3:查看后台进程是否在运行
bash
ps aux | grep system_check.sh # 筛选进程
如果能看到进程信息,说明运行正常。
步骤 4:关闭终端再验证(关键!)
关闭当前终端,重新打开一个新终端,输入:
bash
ps aux | grep system_check.sh
进程仍在运行(没被终端关闭影响),成功!
步骤 5:停止后台进程(需要时)
用kill
命令终止(先找 PID):
bash
ps aux | grep system_check.sh # 找到进程的PID(第二列)
kill -9 进程PID # 强制终止(替换成实际PID)
2. 专业方法:用 systemd 让进程 “开机自启 + 崩溃自动重启”(适合长期服务)
nohup
适合临时任务,systemd
(系统服务管理器)适合 “需要开机自动启动、崩溃后自动恢复” 的长期服务(比如网站服务、监控程序)—— 就像 “给进程配一个专属管家,负责启动、监控、重启”。
实操:把system_check.sh
注册为 systemd 服务
步骤 1:创建服务配置文件(告诉 systemd 如何管理这个进程)
bash
sudo nano /etc/systemd/system/monitor.service # 服务文件名随便起,以.service结尾
步骤 2:写入以下内容(复制粘贴,替换成你的路径):
ini
[Unit]
Description=系统监控服务 # 服务描述(随便写)
After=network.target # 表示“网络启动后再启动这个服务”(可选)
[Service]
User=你的用户名 # 用你的用户身份运行(避免权限问题)
WorkingDirectory=/home/你的用户名/linux_study # 脚本所在目录
ExecStart=/home/你的用户名/linux_study/system_check.sh # 启动脚本的命令
Restart=always # 崩溃后自动重启(关键!)
RestartSec=5 # 崩溃后5秒再重启
[Install]
WantedBy=multi-user.target # 表示“多用户模式下开机自启”
步骤 3:重新加载 systemd 配置(让系统识别新服务)
bash
sudo systemctl daemon-reload
步骤 4:启动服务并设置开机自启
bash
sudo systemctl start monitor # 启动服务
sudo systemctl enable monitor # 设置开机自启
步骤 5:验证服务状态
bash
sudo systemctl status monitor
如果显示 “active (running)”,说明服务正常运行。
步骤 6:测试 “崩溃后是否自动重启”
手动杀死进程,再查看状态:
bash
ps aux | grep system_check.sh # 找PID
kill -9 进程PID # 强制杀死进程
sleep 10 # 等待10秒(让systemd检测到崩溃)
sudo systemctl status monitor # 会显示“active (running)”,说明已自动重启
三、文本处理进阶:sed 多行处理 + awk 字段分隔符(处理复杂文本)
之前学了 sed 和 awk 的基础用法,今天学两个 “处理复杂文本” 的技巧:sed 处理多行内容(比如跨多行的日志)、awk 指定字段分隔符(比如处理 CSV 文件)。
1. sed 多行处理:替换 “跨多行的内容”(比如日志中的错误块)
场景:日志里有跨多行的错误信息(比如:
plaintext
Error: 连接失败
详情:网络超时
时间:2025-07-13 10:00:00
),想把这 3 行整体替换成 “[错误] 网络超时(2025-07-13)”。
sed 多行处理命令(用N
合并行,s
替换):
bash
# 假设日志文件是error.log,先创建这个文件并输入上面的3行内容
nano error.log # 输入示例错误内容
# 用sed合并3行并替换(逐行解释见下方)
sed -i ':a;N;$!ba;s/Error: 连接失败\n详情:网络超时\n时间:\(.*\) .*/[错误] 网络超时(\1)/g' error.log
命令解释(不用记,知道能这么用即可):
:a;N;$!ba
:sed 的 “多行模式”,把所有行合并成一行处理(N
是 “追加下一行”,$!ba
是 “没到最后一行就循环”);s/旧内容/新内容/g
:替换时用\n
表示换行,\(.*\)
捕获 “时间” 中的日期部分(比如2025-07-13
),用\1
在新内容中引用。
验证效果:
bash
cat error.log # 会显示“[错误] 网络超时(2025-07-13)”,3行变成1行
2. awk 指定字段分隔符:处理 “非空格分隔的文本”(比如 CSV 文件)
默认情况下,awk 用空格分隔字段,但实际文本可能用逗号(CSV 文件)、冒号分隔(比如/etc/passwd
),今天学如何指定分隔符。
场景:处理 CSV 文件(用逗号分隔字段,比如name,age,city
),提取 “年龄> 30” 的行。
实操步骤:
步骤 1:创建一个 CSV 文件users.csv
:
bash
nano users.csv # 输入以下内容
csv
张三,25,北京
李四,35,上海
王五,40,广州
赵六,28,深圳
步骤 2:用 awk 指定 “逗号” 为分隔符,提取年龄 > 30 的行:
bash
awk -F ',' '$2 > 30 {print $1, $3}' users.csv
- 解释:
-F ','
:指定字段分隔符为逗号(Field separator);$2 > 30
:第 2 列(年龄)大于 30;print $1, $3
:打印第 1 列(姓名)和第 3 列(城市)。
输出结果:
plaintext
李四 上海
王五 广州
今日必练实操清单(跟着做,15 分钟搞定)
-
磁盘永久挂载:
- 按步骤把之前的虚拟磁盘
test_disk
永久挂载到/mnt/mydisk
,重启后用df -h
验证是否自动挂载。
- 按步骤把之前的虚拟磁盘
-
进程后台守护:
- 用 nohup 让
auto_backup.sh
在后台运行,输出日志到backup.log
,关闭终端后重新打开,确认进程仍在运行。
- 用 nohup 让
-
文本处理进阶:
- 创建一个包含多行错误的日志文件,用 sed 替换成单行摘要;
- 创建一个用
|
分隔的文件(如a|100|yes
),用 awk 提取第 2 列 > 50 的行。
今日总结(3 句话记住核心)
- 永久挂载:改
/etc/fstab
文件,用 UUID 指定磁盘,sudo mount -a
验证,重启后自动挂载(避免每次手动挂载)。 - 后台守护:临时任务用
nohup 命令 > 日志 2>&1 &
;长期任务用systemd
服务(配置Restart=always
实现崩溃自启)。 - 文本进阶:sed 用
:a;N;$!ba
处理多行;awk 用-F '分隔符'
指定字段分隔(适合 CSV、特殊格式文本)。