Linux自用自动备份

[up主专用,视频内嵌代码贴在这]

Linux 自动备份

时间校准

注意:血的教训告诉我勿在备份的时候校准服务器的时间,以免造成异常的备份失效。

设置服务器时区

1
2
3
4
5
6
7
8
# 检查当前时区
timedatectl

# 设置时区为上海(需要root权限)
timedatectl set-timezone Asia/Shanghai

# 验证是否生效
date
1
2
touch sync_time.sh
nano sync_time.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# 同步时间日志文件
LOG_FILE="/var/log/time_sync.log"

# 记录执行时间
echo "===== $(date '+%Y-%m-%d %H:%M:%S %Z') =====" >> "$LOG_FILE"

# 使用chrony或ntpdate同步时间
if command -v chronyc &> /dev/null; then
chronyc -a makestep >> "$LOG_FILE" 2>&1
elif command -v ntpdate &> /dev/null; then
ntpdate pool.ntp.org >> "$LOG_FILE" 2>&1
else
echo "ERROR: Neither chrony nor ntpdate is installed!" >> "$LOG_FILE"
exit 1
fi

# 强制写入硬件时钟(可选)
hwclock -w >> "$LOG_FILE" 2>&1

添加可执行权限,并创建 cron 定时任务。每天0358执行此脚本。

1
2
chmod +x sync_time.sh
crontab -e

添加 cron

1
58 3 * * * /root/sync_time.sh

R5S

自动备份docker compose 和 当前的映射卷,创建 cron 定时任务。此备份将在每周一凌晨六时执行,并且储存一个月以内的备份。

1
2
touch backup_script.sh
nano backup_script.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

# 定义变量
BACKUP_DIR="/ssd/backup" # 请更改为您想要存储备份的实际路径
SOURCE_FOLDER1="/root/app-data" # 请更改为wj文件夹的实际路径
SOURCE_FILES=("/root/docker-compose.yml" "/root/docker-compose.yaml") # 修改为数组形式
DATE_FORMAT=$(date +"%y%m%d-R5S") # 修改这里添加-R5S.bak
BACKUP_NAME="backup_$DATE_FORMAT.tar.gz"
LOG_FILE="/var/log/backup_script.log"

# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"

# 执行备份
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始备份..." >> "$LOG_FILE"

# 检查文件是否存在并添加到备份列表
FILES_TO_BACKUP=("$SOURCE_FOLDER1")
for file in "${SOURCE_FILES[@]}"; do
if [ -f "$file" ]; then
FILES_TO_BACKUP+=("$file")
fi
done

# 执行备份
tar -czf "$BACKUP_DIR/$BACKUP_NAME" "${FILES_TO_BACKUP[@]}" 2>> "$LOG_FILE"

if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份成功: $BACKUP_NAME" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份失败!" >> "$LOG_FILE"
exit 1
fi

# 清理30天前的备份
echo "$(date '+%Y-%m-%d %H:%M:%S') - 清理旧备份..." >> "$LOG_FILE"
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete 2>> "$LOG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') - 清理完成" >> "$LOG_FILE"
1
2
3
4
chmod +x backup_script.sh
crontab -e
# 添加 cron
0 6 * * 1 /root/backup_script.sh