0

0

如何在Linux中设置关机前的自动备份?结合rsync与shutdown命令的实现方法

看不見的法師

看不見的法師

发布时间:2025-09-03 10:38:01

|

312人浏览过

|

来源于php中文网

原创

最直接的方法是创建rsync备份脚本并配置为systemd服务,在关机前自动执行。首先编写脚本定义源目录、目标目录和日志路径,使用rsync的-a、--delete、--exclude等参数实现高效同步,并检查挂载状态与执行结果;将脚本保存为/usr/local/bin/pre_shutdown_backup.sh并赋予执行权限。接着创建systemd服务单元文件/etc/systemd/system/pre-shutdown-backup.service,设置before=shutdown.target确保关机前运行,type=oneshot和remainafterexit=yes保证任务正确执行,wantedby=multi-user.target以便启用服务。最后通过systemctl daemon-reload和enable命令启用服务,并手动测试验证日志输出。该方案弥补了定时备份的时间盲区,特别适用于关键数据的最后保护,通过权限管理、挂载点检查(requiresmountsfor)、日志记录和定期测试确保可靠性,实现关机前数据自动同步,防止意外丢失。

如何在linux中设置关机前的自动备份?结合rsync与shutdown命令的实现方法

在Linux中,要在关机前实现自动备份,最直接且可靠的方法是利用

rsync
命令进行数据同步,并将其集成到
systemd
服务中,使其在系统关机流程启动前执行。这能确保你在最后一次操作后,重要数据得以保存,避免因突发关机或遗忘手动备份而造成损失。

解决方案

要设置一个在Linux系统关机前自动运行的备份,你需要创建一个

rsync
脚本,并将其配置为一个
systemd
服务,使其在
shutdown.target
之前启动。

第一步:创建备份脚本

首先,编写一个shell脚本来执行

rsync
同步操作。我个人习惯把这类系统级脚本放在
/usr/local/bin/
目录下,因为它既方便管理,又不会与系统自带的命令混淆。

#!/bin/bash

# 定义源目录和目标目录
# 注意:源目录末尾的斜杠很重要,它决定了是复制目录本身还是目录下的内容。
# 例如:/home/user/documents/ 会复制documents目录下的所有内容到目标目录
# 而 /home/user/documents 会复制documents目录本身到目标目录
SOURCE_DIR="/home/your_username/Documents/"
BACKUP_DIR="/mnt/backup_drive/my_pre_shutdown_backup/"

# 定义日志文件路径,方便我们查看备份结果和排查问题
LOG_FILE="/var/log/pre_shutdown_backup.log"

# 确保备份目标目录存在
mkdir -p "$BACKUP_DIR" >> "$LOG_FILE" 2>&1

# 检查备份驱动器是否已挂载
# 这一步非常关键,避免rsync往根文件系统写入数据,或者因驱动器未挂载而失败。
if ! mountpoint -q /mnt/backup_drive; then
    echo "$(date): 备份驱动器 /mnt/backup_drive 未挂载,跳过备份。" >> "$LOG_FILE"
    exit 1
fi

echo "$(date): 开始执行关机前自动备份..." >> "$LOG_FILE"

# 执行rsync命令
# -a: 归档模式,保留权限、时间戳、符号链接等
# -v: 详细输出,方便查看同步过程
# -h: 人性化显示文件大小
# --delete: 删除目标目录中源目录不存在的文件,保持同步
# --stats: 显示传输统计信息
# --exclude: 排除不需要备份的文件或目录,例如缓存、临时文件等
rsync -avh --delete --stats \
      --exclude 'Cache/' \
      --exclude 'Downloads/' \
      "$SOURCE_DIR" "$BACKUP_DIR" >> "$LOG_FILE" 2>&1

# 检查rsync的退出状态码
if [ $? -eq 0 ]; then
    echo "$(date): 关机前自动备份成功完成!" >> "$LOG_FILE"
else
    echo "$(date): 关机前自动备份过程中出现错误,请检查日志!" >> "$LOG_FILE"
fi

exit 0

将上述内容保存为

/usr/local/bin/pre_shutdown_backup.sh
,并赋予执行权限:

sudo chmod +x /usr/local/bin/pre_shutdown_backup.sh

第二步:创建Systemd服务单元文件

接着,我们需要告诉

systemd
在关机时运行这个脚本。创建一个服务单元文件:

sudo nano /etc/systemd/system/pre-shutdown-backup.service

粘贴以下内容:

[Unit]
Description=Pre-shutdown Data Backup Service
# 确保在关机、重启、停止等操作前运行此服务
# 这意味着在系统开始真正关闭前,我们的备份任务会先行完成。
Before=shutdown.target reboot.target halt.target
# 如果你的备份目标是网络共享,可能还需要确保网络服务已启动
# After=network-online.target

[Service]
# Type=oneshot 表示服务执行一次后即退出,不常驻内存
Type=oneshot
# RemainAfterExit=yes 告诉systemd即使服务进程退出,也认为服务仍然处于“激活”状态
# 这对于在关机流程中执行的短暂任务很有用。
RemainAfterExit=yes
# ExecStart 指定要执行的命令或脚本
ExecStart=/usr/local/bin/pre_shutdown_backup.sh

[Install]
# WantedBy=multi-user.target 意味着当系统进入多用户模式时,这个服务是“被需要的”
# 虽然它主要在关机时触发,但这个设置允许我们启用它。
WantedBy=multi-user.target

保存并关闭文件。

第三步:启用并测试服务

现在,通知

systemd
加载新的服务,并启用它:

sudo systemctl daemon-reload
sudo systemctl enable pre-shutdown-backup.service

为了确保一切正常,你可以先手动运行一次服务,然后检查日志:

sudo systemctl start pre-shutdown-backup.service
tail -f /var/log/pre_shutdown_backup.log

如果日志显示备份成功,那么你就可以放心了。下次你执行

sudo shutdown -h now
sudo reboot
时,这个备份脚本就会在系统关闭前自动执行。

Midjourney
Midjourney

当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。

下载

为什么常规的定时备份机制,在系统关机前可能不够用?

我经常听到有人说:“我有

cron
定时备份啊,为什么还需要关机前备份?”这其实是一个很实际的问题。定时备份,比如每天凌晨2点跑一次,或者每小时跑一次,固然重要,它能帮你应对大多数数据丢失的场景。但它有一个固有的盲点:时间差

想象一下,你正在赶一篇重要的报告,或者写一段关键的代码,投入了几个小时的心血。你可能在下午5点完成了大部分工作,而你设定的下一次定时备份是晚上10点。突然,老板一个电话,你得立刻关机走人。或者更糟,电脑没电了,直接强制关机。这时候,从下午5点到你关机这一刻的所有修改,都可能没有被定时备份捕获到。这种“最后一刻”的数据变动,往往是最宝贵、最不可替代的。

关机前备份,就是为了填补这个时间差。它像一个忠诚的守卫,在系统即将进入休眠或关闭之前,最后再检查一遍你的“行李箱”,确保所有最新的、未被同步的数据都被妥善打包。它不是要取代定时备份,而是作为一种补充,提供更高级别的数据完整性和安心感。在我看来,这不仅仅是一个技术配置,更是一种对数据负责的态度,尤其对于那些“不能丢”的关键数据,这种双重保障显得尤为重要。

在设计关机前备份脚本时,有哪些关键的rsync参数和最佳实践?

设计一个健壮的

rsync
备份脚本,不仅仅是把源和目标路径填进去那么简单。一些关键的
rsync
参数和实践,能让你的备份更高效、更可靠。

  1. -a
    (archive mode):归档模式,几乎是必选项。 这是
    rsync
    的“万能钥匙”,它等同于
    -rlptgoD
    。这意味着它会递归复制目录、保留符号链接、权限、修改时间、组、所有者,以及设备文件。如果不加这个,你可能会发现复制过去的文件权限不对,或者修改时间丢失,这在恢复数据时会造成不小的麻烦。

  2. --delete
    :保持目标与源目录的同步。 这个参数非常强大,它会删除目标目录中那些在源目录中已经不存在的文件。比如,你删除了源目录中的一个旧项目,
    --delete
    就会确保这个旧项目在备份目录中也被删除。这对于保持备份的“镜像”状态非常有用,避免备份目录变得越来越臃肿,充满了不再需要的文件。但使用时务必小心,确保你的源目录是正确的,否则可能会意外删除数据。

  3. --exclude='PATTERN'
    :排除不需要备份的文件或目录。 不是所有文件都需要备份。例如,你的代码项目中的
    .git/
    目录、
    node_modules/
    target/
    ,或者系统中的
    /tmp
    、各种缓存目录(如浏览器缓存)。排除这些文件不仅能节省备份空间,还能加快备份速度。你可以多次使用
    --exclude
    来排除多个模式。例如:
    --exclude='Cache/' --exclude='Downloads/' --exclude='*.tmp'

  4. -v
    (verbose) 和
    -h
    (human-readable):详细输出和易读性。
    虽然是自动化脚本,但日志的可读性非常重要。
    -v
    会显示
    rsync
    正在传输哪些文件,而
    -h
    会将文件大小显示为KB、MB、GB,而不是字节。这对于快速查看备份进度和排查问题非常有帮助。

  5. 日志记录:

    >> "$LOG_FILE" 2>&1
    这是我个人非常推荐的做法。将
    rsync
    的所有输出(包括标准输出和错误输出)重定向到一个日志文件。这样,即使备份失败,你也能通过查看日志文件来了解具体原因。定期检查这个日志文件,是确保备份健康的最佳实践之一。

  6. 错误处理:检查

    rsync
    的退出状态码。
    rsync
    执行完成后会返回一个退出状态码(
    $?
    )。
    0
    表示成功,非
    0
    则表示出现了错误。在脚本中加入
    if [ $? -eq 0 ]
    这样的判断,可以让你在日志中记录备份的成功或失败状态,甚至可以触发邮件通知。

  7. 源目录和目标目录的斜杠: 这是一个小细节,但经常让人犯错。

    SOURCE_DIR/
    (末尾带斜杠)表示复制
    SOURCE_DIR
    内部的内容到目标目录。
    SOURCE_DIR
    (末尾不带斜杠)表示复制
    SOURCE_DIR
    这个目录本身到目标目录。根据你的需求选择。我通常倾向于带斜杠,这样目标目录看起来更干净。

遵循这些实践,你的关机前备份脚本会更加强大和可靠。

如何确保关机前备份服务能够可靠执行,避免因权限或挂载问题导致失败?

确保关机前备份服务的可靠性,是这个方案成功的关键。毕竟,我们不希望在最需要它的时候,它却悄无声息地失败了。这里有一些我总结的经验,主要围绕权限、挂载点和

systemd
的配置来展开。

  1. 权限管理:

    • 脚本执行权限: 确保你的备份脚本
      pre_shutdown_backup.sh
      拥有执行权限(
      chmod +x
      )。这是最基础的。
    • systemd
      服务运行用户:
      默认情况下,
      systemd
      服务以
      root
      用户运行。这通常是好事,因为它能访问系统中的任何文件,并有权限写入任何挂载点。但这也意味着你需要确保
      rsync
      的源目录和目标目录对
      root
      用户是可读写的。如果你想让服务以非
      root
      用户运行,可以在
      [Service]
      部分添加
      User=your_username
      Group=your_group
      ,但这时你需要额外确保该用户对所有涉及的目录都有足够的权限。我通常建议让备份脚本以
      root
      运行,以避免复杂的权限问题。
  2. 挂载点可靠性: 这是导致备份失败最常见的原因之一。如果你的备份目标是一个外部硬盘或网络共享,那么在

    rsync
    运行之前,它必须已经挂载。

    • systemd
      RequiresMountsFor
      指令:
      这是最优雅的解决方案。在你的
      pre-shutdown-backup.service
      文件的
      [Unit]
      部分,添加一行:
      RequiresMountsFor=/mnt/backup_drive

      这会告诉

      systemd
      ,在启动
      pre-shutdown-backup.service
      之前,必须确保
      /mnt/backup_drive
      这个挂载点是活跃的。如果它没有挂载,
      systemd
      会尝试挂载它,或者如果无法挂载,则会阻止你的备份服务启动。这比在脚本中手动检查挂载点更健壮,因为它利用了
      systemd
      的依赖管理能力。

    • 脚本内部检查: 尽管有
      RequiresMountsFor
      ,但在脚本内部增加一个
      mountpoint -q
      检查仍然是一个好的防御性编程实践。它能捕获一些
      systemd
      可能未处理到的边缘情况,并在日志中提供更明确的错误信息。
  3. 服务依赖和顺序:

    • Before=shutdown.target
      这个指令确保你的备份服务在系统进入真正的关机流程之前完成。
      shutdown.target
      systemd
      在关机时会尝试达到的一个状态,你的服务会在这个状态之前被激活。
    • After=network-online.target
      (如果涉及网络备份):
      如果你的备份目标是NAS或远程服务器,你还需要确保网络服务已经就绪。
  4. 超时设置:

    rsync
    可能会因为数据量大或网络慢而运行很长时间。虽然
    shutdown.target
    通常有自己的超时机制,但你可以在
    systemd
    服务中设置
    TimeoutStartSec
    ,以防万一
    rsync
    卡住导致关机过程无限期延迟。不过,这需要权衡:你希望备份彻底完成,还是希望系统能快速关机?对于关机前备份,通常我们会倾向于让备份完成,即使这意味着关机时间会略长。

  5. 定期测试与日志审查: 任何自动化系统都需要验证。定期(比如每月一次)手动触发你的备份服务(

    sudo systemctl start pre-shutdown-backup.service
    ),并仔细检查日志文件(
    /var/log/pre_shutdown_backup.log
    ),是发现潜在问题和确保服务健康的最佳方式。如果发现错误,及时调整脚本或
    systemd
    配置。

通过细致地处理这些方面,你的关机前自动备份机制就能成为一个值得信赖的数据守护者。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

978

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

579

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

275

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

568

2024.04.09

git怎么对比两个版本的文件内容
git怎么对比两个版本的文件内容

要对比两个版本的 git 文件,请使用 git diff 命令:git diff 比较工作树和暂存区之间的差异。git diff 比较两个提交或标签之间的差异。git diff 输出显示差异块,其中 + 表示添加的行,- 表示删除的行, 表示修改的行。可使用 gitkraken、meld、beyond compare 等可视化工具更直观地查看差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

532

2024.04.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.4万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号