【跟我学Linux】第十三天:磁盘永久挂载、进程后台守护、文本处理进阶

一、磁盘管理进阶:让 “挂载的磁盘重启后不消失”(永久挂载)

之前学过临时挂载磁盘(比如挂载 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 分钟搞定)

  1. 磁盘永久挂载

    • 按步骤把之前的虚拟磁盘test_disk永久挂载到/mnt/mydisk,重启后用df -h验证是否自动挂载。
  2. 进程后台守护

    • 用 nohup 让auto_backup.sh在后台运行,输出日志到backup.log,关闭终端后重新打开,确认进程仍在运行。
  3. 文本处理进阶

    • 创建一个包含多行错误的日志文件,用 sed 替换成单行摘要;
    • 创建一个用|分隔的文件(如a|100|yes),用 awk 提取第 2 列 > 50 的行。

今日总结(3 句话记住核心)

  1. 永久挂载:改/etc/fstab文件,用 UUID 指定磁盘,sudo mount -a验证,重启后自动挂载(避免每次手动挂载)。
  2. 后台守护:临时任务用nohup 命令 > 日志 2>&1 &;长期任务用systemd服务(配置Restart=always实现崩溃自启)。
  3. 文本进阶:sed 用:a;N;$!ba处理多行;awk 用-F '分隔符'指定字段分隔(适合 CSV、特殊格式文本)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值