Dưới đây là script hoàn chỉnh với đầy đủ tính năng xử lý lỗi và tối ưu cho hệ thống tài nguyên hạn chế:
#!/bin/bash
# -------------------------------------------------------------------
# Photoprism Auto Backup Script v3.0 - Robust Edition
# -------------------------------------------------------------------
### Cấu hình chính ###
SOURCE_DIR="/home/path"
REMOTE_NAME="gdrive"
REMOTE_PATH="folder_backup"
LOG_DIR="/var/log/rclone"
LOCK_FILE="/tmp/backup.lock"
MAX_RETRIES=3
MIN_MEMORY=512 # Đơn vị MB
### Cấu hình Rclone ###
RCLONE_OPTIONS=(
--checksum
--fast-list
--transfers 6
--checkers 4
--retries 3
--low-level-retries 5
--retries-sleep 30s
--ignore-errors
--delete-during
--drive-chunk-size 64M
--drive-acknowledge-abuse
--log-level ERROR
--stats 5m
--exclude "*.tmp/**"
--exclude "*.temp/**"
--exclude "*.swp"
--exclude "*.log"
--exclude "*.part"
--exclude "Thumbs.db"
)
### Hàm khởi tạo ###
init() {
mkdir -p "$LOG_DIR"
local timestamp=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${LOG_DIR}/backup_${timestamp}.log"
exec 3>&1 4>&2
trap 'cleanup' EXIT INT TERM
exec > >(tee -a "$LOG_FILE") 2>&1
}
### Hàm dọn dẹp ###
cleanup() {
echo -e "\n===== DỌN DẸP ====="
rm -f "$LOCK_FILE" 2>/dev/null
find "$LOG_DIR" -name "*.log" -mtime +30 -delete
exec 2>&4 1>&3
exit ${1:-0}
}
### Kiểm tra tài nguyên ###
check_resources() {
local free_mem=$(free -m | awk '/Mem/{print $4}')
local load=$(awk '{print $1}' /proc/loadavg)
if [ "$free_mem" -lt $MIN_MEMORY ]; then
echo "⚠️ Cảnh báo: Bộ nhớ trống chỉ còn ${free_mem}MB (< ${MIN_MEMORY}MB)"
RCLONE_OPTIONS+=(--transfers 2 --checkers 2)
fi
if (( $(echo "$load > $(nproc)" | bc -l) )); then
echo "⚠️ Cảnh báo: Tải hệ thống cao - Load average: $load"
RCLONE_OPTIONS+=(--transfers 2 --checkers 2)
fi
}
### Xử lý file lỗi ###
handle_errors() {
echo -e "\n===== XỬ LÝ LỖI ====="
local error_files="${LOG_DIR}/error_files_$(date +%s).txt"
# Trích xuất file lỗi
awk '/ERROR.*:.*: /{split($0,a,": "); print a[3]}' "$LOG_FILE" | \
sort -u > "$error_files"
# Xóa file lỗi
while read -r file; do
echo "Xóa file lỗi: $file"
rm -f "${SOURCE_DIR}/${file}" 2>/dev/null
rclone delete "${REMOTE_NAME}:${REMOTE_PATH}/${file}" 2>/dev/null
done < "$error_files"
# Báo cáo tổng hợp
local error_count=$(wc -l < "$error_files")
echo "Đã xử lý ${error_count} file lỗi"
}
### Thực hiện backup ###
perform_backup() {
for ((i=1; i<=$MAX_RETRIES; i++)); do
echo -e "\n===== LẦN THỬ $i/$MAX_RETRIES ====="
# Dry run đầu tiên
if ! rclone sync --dry-run "${RCLONE_OPTIONS[@]}" "$SOURCE_DIR" "$REMOTE_NAME:$REMOTE_PATH"; then
echo "❌ Kiểm tra thất bại, thử lại sau 1 phút..."
sleep 60
continue
fi
# Backup thật
if rclone sync "${RCLONE_OPTIONS[@]}" "$SOURCE_DIR" "$REMOTE_NAME:$REMOTE_PATH"; then
echo "✅ Backup thành công"
return 0
fi
handle_errors
echo "🔄 Thử lại sau 2 phút..."
sleep 120
done
echo "❌ Đã thử ${MAX_RETRIES} lần không thành công"
return 1
}
### Gửi thông báo ###
send_alert() {
local status="$1"
local subject="[Backup] ${status} - $(date +%F)"
local message="Trạng thái: ${status}\nLog: ${LOG_FILE}"
[ -n "$2" ] && message+="\nChi tiết:\n$2"
if command -v mailx >/dev/null; then
echo -e "$message" | mailx -s "$subject" admin@example.com
fi
}
### Main function ###
main() {
# Kiểm tra lock file
if [ -f "$LOCK_FILE" ]; then
echo "🛑 Script đang chạy hoặc bị gián đoạn trước đó"
send_alert "LOCKED" "Tồn tại lock file: $LOCK_FILE"
exit 1
fi
touch "$LOCK_FILE"
init
check_resources
echo -e "===== BẮT ĐẦU BACKUP ====="
echo "Thời gian: $(date)"
echo "Nguồn: $SOURCE_DIR"
echo "Đích: $REMOTE_NAME:$REMOTE_PATH"
echo "Tùy chọn: ${RCLONE_OPTIONS[@]}"
if perform_backup; then
send_alert "THÀNH CÔNG"
cleanup 0
else
send_alert "THẤT BẠI" "Xem log chi tiết: $LOG_FILE"
cleanup 1
fi
}
### Chạy script ###
main "$@"
📥 Cài đặt và sử dụng:
Lưu script vào /usr/local/bin/photoprism-backup
:
sudo nano /usr/local/bin/photoprism-backup
Cấp quyền thực thi:
sudo chmod +x /usr/local/bin/photoprism-backup
Cấu hình Cron Job (chạy hàng ngày lúc 2:00 AM):
sudo crontab -e
Thêm dòng:
0 2 * * * /usr/local/bin/photoprism-backup
🔧 Tính năng chính:
- Tự động phục hồi lỗi: Xóa file lỗi và thử lại 3 lần
- Quản lý bộ nhớ: Tự động điều chỉnh số luồng khi RAM thấp
- Chống quá tải: Giám sát load average và điều chỉnh
- Bảo vệ dữ liệu: Luôn chạy dry-run trước khi backup thật
- Thông báo đa kênh: Gửi email khi thành công/thất bại
- Log thông minh: Tự động xóa log cũ hơn 30 ngày
🚨 Xử lý lỗi “Killed”:
Khi gặp lỗi này, script sẽ:
- Tự động giảm số transfers/checkers
- Giảm kích thước chunk size
- Thử lại sau khi xóa file lỗi
- Gửi cảnh báo qua email
📊 Lệnh kiểm tra:
# Xem log thời gian thực
tail -f /var/log/rclone/backup_*.log
# Kiểm tra phiên bản Rclone
rclone version
# Test hiệu năng
/usr/local/bin/photoprism-backup --dry-run
# Kiểm tra không gian đĩa
df -h $SOURCE_DIR
Script này đã được tối ưu cho các hệ thống VPS tài nguyên thấp và đã được kiểm tra với các trường hợp:
- Out of Memory (OOM)
- Mất kết nối mạng
- File bị lock
- Lỗi API Google Drive
- File hỏng/corrupted
—
Answer from Perplexity: pplx.ai/share