最直接的方法是创建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
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
我经常听到有人说:“我有
cron
想象一下,你正在赶一篇重要的报告,或者写一段关键的代码,投入了几个小时的心血。你可能在下午5点完成了大部分工作,而你设定的下一次定时备份是晚上10点。突然,老板一个电话,你得立刻关机走人。或者更糟,电脑没电了,直接强制关机。这时候,从下午5点到你关机这一刻的所有修改,都可能没有被定时备份捕获到。这种“最后一刻”的数据变动,往往是最宝贵、最不可替代的。
关机前备份,就是为了填补这个时间差。它像一个忠诚的守卫,在系统即将进入休眠或关闭之前,最后再检查一遍你的“行李箱”,确保所有最新的、未被同步的数据都被妥善打包。它不是要取代定时备份,而是作为一种补充,提供更高级别的数据完整性和安心感。在我看来,这不仅仅是一个技术配置,更是一种对数据负责的态度,尤其对于那些“不能丢”的关键数据,这种双重保障显得尤为重要。
设计一个健壮的
rsync
rsync
-a
rsync
-rlptgoD
--delete
--delete
--exclude='PATTERN'
.git/
node_modules/
target/
/tmp
--exclude
--exclude='Cache/' --exclude='Downloads/' --exclude='*.tmp'
-v
-h
-v
rsync
-h
日志记录:>> "$LOG_FILE" 2>&1
rsync
错误处理:检查rsync
rsync
$?
0
0
if [ $? -eq 0 ]
源目录和目标目录的斜杠: 这是一个小细节,但经常让人犯错。
SOURCE_DIR/
SOURCE_DIR
SOURCE_DIR
SOURCE_DIR
遵循这些实践,你的关机前备份脚本会更加强大和可靠。
确保关机前备份服务的可靠性,是这个方案成功的关键。毕竟,我们不希望在最需要它的时候,它却悄无声息地失败了。这里有一些我总结的经验,主要围绕权限、挂载点和
systemd
权限管理:
pre_shutdown_backup.sh
chmod +x
systemd
systemd
root
rsync
root
root
[Service]
User=your_username
Group=your_group
root
挂载点可靠性: 这是导致备份失败最常见的原因之一。如果你的备份目标是一个外部硬盘或网络共享,那么在
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
服务依赖和顺序:
Before=shutdown.target
shutdown.target
systemd
After=network-online.target
超时设置:
rsync
shutdown.target
systemd
TimeoutStartSec
rsync
定期测试与日志审查: 任何自动化系统都需要验证。定期(比如每月一次)手动触发你的备份服务(
sudo systemctl start pre-shutdown-backup.service
/var/log/pre_shutdown_backup.log
systemd
通过细致地处理这些方面,你的关机前自动备份机制就能成为一个值得信赖的数据守护者。
以上就是如何在Linux中设置关机前的自动备份?结合rsync与shutdown命令的实现方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号