backup.sh 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/bin/bash
  2. # 基础配置
  3. backup_dir="/mnt/mydata/backup" # 本地备份路径
  4. data_dir="/mnt/mydata" # 要备份的目录
  5. hostname=$(hostname) # 获取主机名
  6. cloud_dir="backup/$hostname" # 云端存储路径,使用hostname区分
  7. log_file="/var/log/bypy_backup.log" # 日志文件
  8. # 日志函数
  9. log_message() {
  10. echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file"
  11. echo "$1"
  12. }
  13. # 创建本地备份目录
  14. mkdir -p "$backup_dir"
  15. # 生成备份文件名
  16. backup_file="backup-$hostname-$(date +'%Y-%m-%d').tar.gz"
  17. backup_path="$backup_dir/$backup_file"
  18. # 1. 首先创建新备份
  19. log_message "开始创建备份文件..."
  20. tar -czf "$backup_path" \
  21. --exclude="$data_dir/.Recycle_bin" \
  22. --exclude="$backup_dir" \
  23. "$data_dir" 2>/dev/null
  24. if [ $? -eq 0 ]; then
  25. log_message "备份文件创建成功: $backup_path"
  26. else
  27. log_message "备份文件创建失败"
  28. exit 1
  29. fi
  30. # 2. 然后清理本地旧备份
  31. num_local_backups=$(ls -l "$backup_dir" | grep ^- | grep 'backup-' | wc -l)
  32. if [ $num_local_backups -gt 1 ]; then
  33. oldest_local_backup=$(ls -t "$backup_dir" | grep 'backup-' | tail -1)
  34. rm "$backup_dir/$oldest_local_backup"
  35. log_message "删除本地旧备份: $oldest_local_backup"
  36. fi
  37. # 3. 最后同步到云端
  38. log_message "确保云端目录存在..."
  39. /www/server/pyporject_evn/versions/3.13.0/bin/bypy mkdir "$cloud_dir"
  40. # 添加 -v 参数显示详细进度,并记录到日志
  41. log_message "开始上传到云端..."
  42. /www/server/pyporject_evn/versions/3.13.0/bin/bypy -v syncup "$backup_dir" "$cloud_dir" 2>&1 | while IFS= read -r line; do
  43. # 更严格的过滤条件
  44. if [[ $line =~ ^\[.*%.*MB\/.*MB.*ETA.* ]] || \
  45. [[ $line =~ ^Done$ ]] || \
  46. [[ $line == *"100%"* ]]; then
  47. echo "$line"
  48. echo "$(date +'%Y-%m-%d %H:%M:%S') - $line" >> "$log_file"
  49. fi
  50. done
  51. log_message "备份流程完成"
  52. # 显示当前云端备份列表
  53. log_message "当前云端备份列表:"
  54. /www/server/pyporject_evn/versions/3.13.0/bin/bypy list "$cloud_dir" >> "$log_file"