Guest User

backup-root.sh

a guest
Jan 5th, 2026
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.89 KB | Source Code | 0 0
  1. #!/bin/bash
  2.  
  3. SOURCEDIR="/"
  4. TARGETDIR="/path/to/backup/location" #this one must not end with a / !!!!
  5. EXCLUDELIST="/path/to/backup-root-exclude-list.txt"
  6.  
  7. LOGDIR="/path/to/rootbackup/logs/"
  8. mkdir -p "$LOGDIR"
  9. LOGFILE="$LOGDIR/rsync-backup-root-$(date '+%Y-%m-%d_%H-%M-%S').log"
  10.  
  11.  
  12. echo "SOURCEDIR   : $SOURCEDIR" >> "$LOGFILE"
  13. echo "TARGETDIR   : $TARGETDIR" >> "$LOGFILE"
  14. echo "EXCLUDELIST : $EXCLUDELIST" >> "$LOGFILE"
  15. echo "LOGDIR      : $LOGDIR" >> "$LOGFILE"
  16.  
  17. echo "" >> "$LOGFILE"
  18. echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting rsync job" >> "$LOGFILE"
  19. echo "" >> "$LOGFILE"
  20.  
  21. # DRY-RUN:
  22. rsync --dry-run -axv --progress -s --exclude-from="$EXCLUDELIST" "$SOURCEDIR" "$TARGETDIR" >> "$LOGFILE" 2>&1
  23.  
  24. # REAL BACKUP
  25. # rsync -axv -s --delete --exclude-from="$EXCLUDELIST" "$SOURCEDIR" "$TARGETDIR" >> "$LOGFILE" 2>&1
  26.  
  27.  
  28. # STATUS
  29. echo "" >> "$LOGFILE"
  30.  
  31. STATUS=$?
  32. if [ $STATUS -eq 0 ]; then
  33.   echo "[$(date '+%Y-%m-%d %H:%M:%S')] rsync job completed successfully :)" >> "$LOGFILE"
  34. else
  35.   echo "[$(date '+%Y-%m-%d %H:%M:%S')] rsync job !!! FAILED !!! with status $STATUS" >> "$LOGFILE"
  36. fi
  37.  
  38. # LOG ROTATION LOGIC
  39. echo "" >> "$LOGFILE"
  40.  
  41. # Get list of all log files, sorted by timestamp (oldest first)
  42. LOGS=($(find "$LOGDIR" -type f -name 'rsync-backup-root*.log' -printf '%f\n' | sort))
  43. TOTAL_LOGS=${#LOGS[@]}
  44.  
  45. if [ $TOTAL_LOGS -lt 2 ]; then
  46.   # Only one or zero logs, nothing to rotate
  47.   echo "[$(date '+%Y-%m-%d %H:%M:%S')] No log rotation needed (less than 2 logs)" >> "$LOGFILE"
  48. else
  49.   # Always keep the very oldest log (${LOGS[0]})
  50.   # Rotate: keep up to 30 newest logs (${LOGS[-20..-1]} in bash array)
  51.   # Delete all others except the oldest and the newest 30
  52.   for ((i=1; i<TOTAL_LOGS-30; i++)); do
  53.     if [ $i -lt $TOTAL_LOGS ]; then
  54.       echo "[$(date '+%Y-%m-%d %H:%M:%S')] Removing old log: ${LOGS[$i]}" >> "$LOGFILE"
  55.       rm -f "$LOGDIR/${LOGS[$i]}"
  56.     fi
  57.   done
  58. fi
  59.  
  60.  
Advertisement
Add Comment
Please, Sign In to add comment