Puncte:0

Scriptul Bash rsync nu se va finaliza pentru copiile de rezervă mari

drapel us

În ultimul an sau cam așa ceva, am încercat să învăț scripting bash pe Ubuntu (o casetă 20.04 LTS și una 21.04). Simt că abilitățile mele au progresat frumos, dar sunt la capătul minții cu un anumit script de rezervă pe care l-am scris.

Pe scurt, dacă scriptul de rezervă încearcă doar să facă o copie de rezervă a directorului meu /home, rulează fără probleme de la început până la sfârșit, dar dacă încearcă să facă o copie de rezervă a directorului meu /, rulează până la finalizarea procesului de rsync (inclusiv crearea unui fișier jurnal ), și apoi scriptul pur și simplu pare să se oprească, eveniment deși am un cod de menaj care urmează să mă alerteze. Am adăugat chiar și o capcană de ieșire, dar aceasta nu este declanșată.

Nu știu ce îmi lipsește, dar sunt dornic să încerc să învăț, dacă mă poate ajuta cineva.

Nu știu dacă va ajuta, dar iată o versiune ușor simplificată a scriptului meu:

#!/bin/bash
#
# copie de rezervă
# foldere unificate de backup, de acasă și/sau rădăcină pentru a ataca Betty
# rulează zilnic din sudo crontab (timpul variază în funcție de dispozitiv); ziua lunii determină ce copie de rezervă se efectuează
#
# fișiere înrudite
# generează backup.log în folderul principal al utilizatorului principal, arhivează backup.log existent în folderul jurnal ca aaaa-mm-dd-backup.log
# necesită două fișiere în $homefold: home-backup.exclude și boot-backup.exclude, pentru a oferi excluderi de rezervă pentru rsync
#
# capcană de ieșire
function badquit {
   if [[ "$1" = "test" ]] ; atunci
      iesirea 0
   elif [[ "$goodflag" = "0" ]] ; atunci
      echo "$(data +%r): $shname a ieșit cu goodflag=0" > $logfold/$shname.quit
   fi
}
trap badquit EXIT
#
# variabile
gazdă="$(nume gazdă)"
hostlc="${gazdă,,}"
shname="$(nume de bază $0)"
hostuser="$(getent passwd "1000" | cut -d: -f1)"
homefold="/home/$hostuser"
logfold="$homefold/logs"
log="$homefold/$shname.log"
data="$(data +%Y-%m-%d)"
dom="$(date +%d)" # zi a lunii în timpul execuției determină ce backup este efectuat (acasă zilnică, acasă săptămânală, pornire trimestrială)
soonwarn="7" # zile înainte pentru a crea un raport .soon
case $host în # $bumount locația variază în funcție de dispozitiv: Betty îl montează diferit față de toate celelalte
   Betty)
      bumount="/mnt/raid"
      ;;
   *)
      bumount="/media/betty-raid"
      ;;
esac
bufold="$bumount/$hostlc"
goodflag="0" # stare implicită a goodflag pentru a declanșa un mesaj de ieșire neașteptat
#
# preverificare
# confirmați existența $bufold, încercați să montați dacă nu este găsit, setați mesajul de eșec dacă nu reușește
dacă [[ ! -e $bufold ]] ; atunci
   mount 192.168.x.x:/mnt/raid $bumount
   somn 5
   dacă [[ ! -e $bufold ]] ; atunci
      echo "$(data +%r): $shname a ieșit deoarece $bufold nu a putut fi montat" > $logfold/$shname.quit
      goodflag="1"
      iesirea 1
   fi
fi
# 
# gestionarea jurnalelor
if [[ -e $log ]] ; atunci
   mv $log $logfold/"$(data -r $log +"%Y-%m-%d")"-$shname.log
fi
#
# sarcini principale
# setați targdom pe programul vechi de backup de pornire (pentru a permite timp pentru .soon)
caz $host in
   Betty)
      targdom="8"
      ;;
   Veronica)
      targdom="12"
      ;;
   *)
      echo "$(data +%r): $shname nu poate identifica $host" > $logfold/$shname.quit
      goodflag="1"
      iesirea 1
      ;;
esac   
# stabiliți ce backup să rulați, setați variabilele finale
if [[ "$dom" = "$targdom" ]] ; apoi # targdom declanșează backup-uri non-zilnic
   dacă [[ $(data +%m) -eq "01" ]] || [[ $(data +%m) -eq "04" ]] || [[ $(data +%m) -eq "07" ]] || [[ $(data +%m) -eq "10" ]] ; apoi # backup trimestrial de boot ian, apr, iul, oct
      ropts="-avuHkbi --delete --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" 
      rsource="/"
   altfel # backup lunar de acasă
      ropts="-axvuHkbi --delete --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log"
      rsource="/home"
   fi
altfel # nu țintă, backup zilnic acasă
   ropts="-axvuHkbi --exclude-from=$homefold/home-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" #daily backup acasă
   rsource="/home"
fi
# dacă acesta este un test, setați variabilele în mod corespunzător
if [[ "$1" = "test" ]] ; atunci
   ropts="-navuHkbi --exclude-from=$homefold/boot-backup.exclude --backup-dir=$bufold/Backup.$date --log-file=$log" # dry-run ON
   rsource="/"
fi
# rulați backupul, în sfârșit
rsync $ropts --backup-dir=$bufold/Backup.$date --log-file=$log $rsource $bufold
#
# setați exitcond
dacă [[ "$?" = "0" ]] ; atunci
# de succes, jurnalul a fost salvat
   exitcond="cu succes, jurnalul a fost salvat"
altfel
# nereușit, cond. de ieșire
   exitcond="fără succes, codul de ieșire $?"
fi
#
echo "$(data +%r): $shname completat $exitcond" >> $logfold/$shname.done
goodflag="1"
sudodus avatar
drapel jp
Când încercați să faceți o copie de rezervă a partiției rădăcină `/`, vor exista și fișiere de sistem active, care vor fi modificate de procesul rsync. Deci **fie excludeți directoarele cu astfel de fișiere (de exemplu, `/run` și `/proc`), fie porniți de pe alt sistem** (de exemplu, un sistem live bootat de pe USB sau un al doilea sistem într-un sistem dual boot). Presupun că rulați deja scriptul cu `sudo` pentru a face posibilă citirea tuturor fișierelor și păstrarea tuturor permisiunilor și proprietăților.
Thomas Aichinger avatar
drapel cn
Prima mea presupunere este că există unele fișiere care nu pot fi copiate (socket-uri, dispozitive) Pentru a urmări această problemă, încercați să eliminați scriptul bash și să scrieți doar o singură linie rsync --cu-toți-parametrii. Apoi încercați să reproduceți această eroare și să o postați aici.
Artur Meinild avatar
drapel vn
+1 pentru excluderea directoarelor de sistem. Căutați aici mai multe [informații despre sistemul de fișiere](https://www.linux.com/training-tutorials/linux-filesystem-explained/). Aș presupune că `/dev`, `/proc`, `/run` și `/sys` ar trebui să fie întotdeauna excluse, deoarece acestea sunt toate sisteme de fișiere virtuale.
KneadToKnow avatar
drapel us
Voi posta fișierul meu .exclude în această seară, când îl voi putea accesa din nou. Cred că am păstrat majoritatea directoarelor menționate în afara copiei de rezervă. Poate că am dat peste ceva când mă uitam la ceea ce credeam că este o problemă diferită, totuși: cred că încercarea de a face o copie de rezervă a directorului /usr/bin/x11 poate crea o buclă infinită, ceea ce ar explica cu siguranță de ce scriptul nu se termină niciodată. .
KneadToKnow avatar
drapel us
Ei bine, când m-am dus să-mi iau fișierul .exclude, am descoperit că, de fapt, script-ul încă mai mergea, rulând în acel moment timp de aproximativ 17 ore. A trebuit să mă ocup de alte lucruri, dar știu din software-ul meu de menaj că încă rula atunci când backup-ul obișnuit de noapte a început la 1:00 azi dimineață, așa că va trebui să urmăresc toate acestea mâine când pot. așează-te și examinează toate buștenii. Încă bănuiesc că adevărata problemă este că /usr/bin/x11 și, eventual, directoare similare care sperăm că o combinație bună de parametri include-file și exclude-file se vor rezolva.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.