Î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"