Nowe posty

Autor Wątek: Kasowanie Backup'u  (Przeczytany 2559 razy)

mrhe

  • Gość
Kasowanie Backup'u
« dnia: 2013-10-09, 12:55:14 »
Witam
Piszę skrypt do kasowania backupów, i chciałbym zaczerpnąć waszej opinii.

Backupy robią się raz dziennie każdy w osobnym folderze o nazwie F$date

   
F201307130821
F201307133453
F201307311212
F201309240950
W każdym folderze tworzy się plik log_file z error codem backupu.
 
Backup finish  with 0 code error
Piszę skrypt który będzie sprawdzał ilość dobrych backupów i złych, kasował złe i zostawiał minimalną ilość dobrych backupów, jeżeli nie będzie min. dobrych to zostawi również złe.  

naklepałem coś takiego
#!/bin/bash

function del_backup ( ){

    dir=$1
    max_depth=$2
    atime=$3
    min_good_bckp=$4
    good_bckp_counter=0

#    cd $dir/
########################################################################
## petla zlicza dobre backupy z error code = 0 i dodaje 1 do countera ##
########################################################################
    for i in F* ; do
        echo $i
        log_file_code=$(cat $i/log_file | grep Back | awk '{print $4}')
        if [ "$log_file_code" = 0 ]; then
            good_bckp_counter=$[good_bckp_counter + 1]
        fi
    done

#########################################################################

    #echo ilosc dobrych bckpow = $good_bckp_counter
    #echo min good bckp = $min_good_bckp


########################################################################
## if ilość dobrych wieksza od minimalnej ilosci dobrych              ##
########################################################################

    if [ "$good_bckp_counter" -gt "$min_good_bckp" ]; then
                         echo kasuje...
                         find find . -maxdepth $max_depth -atime +$atime -name "F201*/" -exec rm -r {} \\;
    else
        exit 1
    fi
}

del_backup test 1 2 2
ale zastanawiam się jak zrobić selektywne kasowanie tj rozpoznanie który katalog jest dobry który zły, więc zrobiłem tablice gdzie jest nazwa i kod . Czy takie rozumowanie ma sens? Nie wiem jak obliczyć ilość starszych niż 30 dni, myślałem o czyś takim

date -d "$a -30 days" +%Y%m%d
potem prównanie i usuwanie starszych z error codem innym niz 0 , może da się to zrobić lepiej łatwiej szybciej, proszę o wyrozumiałość i opinie. Krytyka mile widziana :)

#!/bin/bash.

DIRS=$(find . -type d | wc -l)
echo '#######################'
echo liczba folderow = $DIRS
echo '#######################'

#########################################
# tworzenie tablic z nazwami folderow   #
#########################################
k=0
n=0
good_bckp_counter=0
bad_bckp_counter=0
            for i in F* ; do
               echo n = $n;  echo i = $i
                matrix_dir[$n]=$i;
                echo  'matrix_dir['$n']'  =  ${matrix_dir[$n]}
                error_code=$(cat $i/log_file | grep Back | awk '{print $4}')
                matrix_error[$n]=$error_code
                echo  'matrix_error['$n']'  =  ${matrix_error[$n]}
                        if [ ${matrix_error[$n]} -eq 0 ]
                        then
                            good_bckp_counter=$[good_bckp_counter + 1]

                        else
                            bad_bckp_counter=$[bad_bckp_counter +1]
                        fi
                n=$[n + 1]

            done

            echo ilosc bkpow z  error -ne 0 = $bad_bckp_counter
            echo ilosc bkpow z  error -eq 0 = $good_bckp_counter.
            while [ $k -ne $n ] ; do
            echo Folder  ${matrix_dir[$k]} kod: ${matrix_error[$k]} id= $k....
            k=$[k + 1]
            done

darkdancer

  • Gość
Kasowanie Backup'u
« Odpowiedź #1 dnia: 2013-10-10, 19:45:57 »
Troszkę inne podejście z mojej strony, może bardziej przenośne, bez finda, bez użycia bashowych tablic i tym podobnych udogodnień (jak gdzieś nie da się obejść bez tablic zwykle lepiej to i tak napisać w czymś innym). Przyjąłem, że każdy katalog z backupem jest oznaczony specjalnym plikiem .good/.bad w zależności od jakości backupu - równie dobrze można w pętli grepować jakieś pliki ale chyba wygodniej i prościej ocenić jakość podczas powstawania i dawać przynajmniej touch .good jeśli skrypt backupujący doszedł do końca. Jeśli wszystkie katalogi trzymają się określonego nazewnictwa z datą utworzenia backupu to nie ma sensu sprawdzać dodatkowo dat utworzenia/modyfikacji (szczególnie modyfikacji, gdy ktoś coś zmieni w takim backupie i nagle katalog "odmłodnieje", backupy lubią również zmieniać często lokalizację a nie każdy admin pamięta o kopiowaniu atrybutów plików...). Podobna sprawa dotyczy sortowania, shell "powinien" zwracać nazwy katalogów w kolejności alfanumerycznej, więc "pseudotablice" z nazwami katalogów już od początku mogą być posortowane, ale dodałem dla pewności. Słowo wyjaśnienia co do parametru przekazywanego do skryptu, jest to oczywiście minimalna ilość kopii zapasowych, które chcemy zatrzymać. Skrypt rzecz jasna niczego nie usuwa a jedynie wyświetla nazwy katalogów, które powinien usunąć gdyby usuwał :-)
Kod: bash [Zaznacz]
#!/bin/sh

#set -x
# vim: ts=4 sw=4

preserve=#!/bin/sh

#set -x
# vim: ts=4 sw=4

preserve=$1
bad=0
good=0
bad_dirs=
good_dirs=

for bak_dir in F* ; do
    if [ -f ${bak_dir}/.bad ]; then
        bad=$((bad + 1))
        bad_dirs="${bad_dirs}\\n${bak_dir}"
    elif [ -f ${bak_dir}/.good ]; then
        good=$((good + 1))
        good_dirs="${good_dirs}\\n${bak_dir}"
    fi
done

echo "Bad backups: $bad"
echo "Good backups: $good"

if [ $good -ge $preserve ]; then
    bad_to_delete=$bad
    good_to_delete=$((good - preserve))
else
    good_to_delete=0
    bad_to_delete=$((good + bad - preserve))
    [ $bad_to_delete -lt 0 ] && bad_to_delete=0
fi

echo -e "\\nTotal to delete: $((good_to_delete + bad_to_delete))"
echo "Good to delete: $good_to_delete"
echo "Bad to delete: $bad_to_delete"

if [ $bad_to_delete -gt 0 ]; then
    echo -e "\\nBad directories to delete:"
    echo -e $bad_dirs | tail -n +2 | sort -nk1.2 | head -${bad_to_delete}
fi
if [ $good_to_delete -gt 0 ]; then
    echo -e "\\nGood directories to delete:"
    echo -e $good_dirs | tail -n +2 | sort -nk1.2 | head -${good_to_delete}
fi

bad=0
good=0
bad_dirs=
good_dirs=

for bak_dir in F* ; do
    if [ -f ${bak_dir}/.bad ]; then
        bad=$((bad + 1))
        bad_dirs="${bad_dirs}\\n${bak_dir}"
    elif [ -f ${bak_dir}/.good ]; then
        good=$((good + 1))
        good_dirs="${good_dirs}\\n${bak_dir}"
    fi
done

echo "Bad backups: $bad"
echo "Good backups: $good"

if [ $good -ge $preserve ]; then
    bad_to_delete=$bad
    good_to_delete=$((good - preserve))
else
    good_to_delete=0
    bad_to_delete=$((good + bad - preserve))
    [ $bad_to_delete -lt 0 ] && bad_to_delete=0
fi

echo -e "\\nTotal to delete: $((good_to_delete + bad_to_delete))"
echo "Good to delete: $good_to_delete"
echo "Bad to delete: $bad_to_delete"

if [ $bad_to_delete -gt 0 ]; then
    echo -e "\\nBad directories to delete:"
    echo -e $bad_dirs | tail -n +2 | sort -nk1.2 | head -${bad_to_delete}
fi
if [ $good_to_delete -gt 0 ]; then
    echo -e "\\nGood directories to delete:"
    echo -e $good_dirs | tail -n +2 | sort -nk1.2 | head -${good_to_delete}
fi