Archiwum kategorii 'Skrypty'

Prosty backup w bashu

Dziś inaczej niż zwykle, zamiast dłuższego tekstu będzie krótki o tym jak w prosty sposób można napisać skrypt do backup’owania plików i folderów w bashu. Skrypt stworzyłem związku z ‘pracą domową’ jaką mi zadano na laboratoriach z linuxa na mych studiach. Skrypt jest na GPLu, więc korzystać z niego może każdy pod warunkiem, że zostanę o tym poinformowany. Można też go przerabiać do woli ale też o tym trzeba informować mnie.

Skrypt jest prosty szybki i nie wymaga szczegółowej i dogłębnej wiedzy basha. Zacznijmy od postawy: umieszczamy wpis informujący że chcemy uruchomić skrypt:

——————–

#!/bin/bash

——————–

Następnie możemy umieścić kilka komentarzy związanych ze skryptem, np drobne informacje co robi skrypt i kto napisał program. Kolejnym krokiem jest napisanie zmiennych odpowiedzialnych za informowanie skryptu gdzie chcemy i co chcemy backup’ować.

1. Zmienna OUTPUT informuje skrypt o tym gdzie ma być plik z backup’em zapisywany oraz w jakiej formie (w tym przypadku będzie to archiwum tgz):

——————–

OUTPUT=/ścieżka_do_folderu/backup/backup_$(date +%Y%m%d).tgz

——————–

2. Zmienna BUDIR domyślnie wskazuje co ma być backup’owane, ale w tym przypadku jest to dodatkowy wiersz poleceń który czyta ścieżki z pliku tekstowego paths.txt znajdującego w wybranej przez nas lokalizacji:

——————–

BUDIR=`cat /ścieżka_do_folderu/paths.txt | grep -Ev "^#|^$"`

——————–

Plik tekstowy może wyglądać tak:

——————–

/home
/etc/acpi
/etc/samba
/usr/share/openbox

——————–

To jakie ścieżki znajdą się w tym pliku zależy już tylko od tego co chcecie backup’ować.

3. Zmienna DATEOLD odpowiada za sprawdzanie czy nie ma wcześniejszych backup’ów w naszej lokalizacji:

——————–

DATEOLD=/ścieżka_do_folderu/backup/backup_$(date -d '7 day ago' +%Y%m%d).tgz

——————–

4. Zmienna LOGFILE odpowiada za tworzenie pliku z logiem skryptu. Możemy w nim przeczytać co zostało backup’owane i w przypadku błędu, co źle poszło:

——————–

LOGFILE=/ścieżka_do_folderu/backup/backup.log

——————–

5. Ostatnia potrzebna nam zmienna to DATE. Dzięki niej w skrypt zapisuje datę dnia w którym backup został wykonany:

——————–

DATE=$(date +%Y-%m-%d)

——————–

Teraz przejdźmy do wykonywania skryptu. Najpierw informujemy użytkownika, że skrypt ruszył w konkretnym dniu oraz wysyłamy tą informację do pliku logującego.

——————–

echo "Starting backup script on $DATE"
echo -e "\n\nStarting backup script on $DATE\n" >> $LOGFILE

——————–

Następnie skrypt sprawdza czy istnieje backup z przed 7 dni. Jeśli tak stary plik zostanie usunięty. Sprawdzenie odbywa się za pomocą prostego programu ‘test’, który jest w więksozści podstatowowych dystrybucji linuxa. Oczywiście wszystkie informacje o procesie są zapisywane do logfile:

——————–

if test -e $DATEOLD ; then
rm -rf $DATEOLD
echo "Backup from $DATEOLD Removed." >> $LOGFILE
else
echo "No Backup for $DATEOLD exists. Continuing..." >> $LOGFILE
fi

——————–

Teraz najważniejsze. Skrypt taruje wskazane przez zmienną $BUDIR pliki o foldery do lokalizacji określonej przez zmienną $OUTPUT:

——————–

echo "Starting backup of directory $BUDIR to file $OUTPUT" >> $LOGFILE
tar -cZf $OUTPUT $BUDIR

——————–

Dodajemy do programu także fragment informujący nas czy backup się powiódł:

——————–

if [ $? == 0 ]; then
echo "The file:" >> $LOGFILE
echo $OUTPUT>> $LOGFILE
echo "was created as a backup for directiories:" >> $LOGFILE
echo $BUDIR >> $LOGFILE
echo "Done! Backup file succesfully created!"
echo "You can find all information about bacup in $LOGFILE"

——————–

oraz za pomocą polecenia ‘else’ fragment informujący nas w przypadku niepowodzenia:

——————–

else
echo "There was a problem creating:" >> $LOGFILE
echo $OUTPUT >> $LOGFILE
echo "as a backup for directories:" >> $LOGFILE
echo $BUDIR >> $LOGFILE
echo "Error! I can't create backup file!"
echo "You can find all information about bacup in $LOGFILE"

Oczywiście wyświetla nam się tylko prosta informacja o tym, a szczegółowa jest zapisywana w pliku logującym. Skrypt kończymy prostym:

fi

——————–

Koniec. Program wstawiony jakiego cron’a labo innego managera czasu który będziemy mogli odpalać automatycznie co 7 dni. Oczywiście edytując w prosty sposób linijki skryptu możemy zmienić ten czas.

Na koniec wrzucam cały skrypt z moim ścieżkami:

——————–

#!/bin/bash
#BackUp bash script ver 1.0 created by Piotr Pertyński.
#Script backups everything from directories given in specified text file checking firstly if
#there exist earlier file from week ago. It use tar command to create *.tgz file.
#This script is under GPL. If you want to use it contact with me via email: ppertynski@gmail.com

OUTPUT=/home/phase/backup/backup_$(date +%Y%m%d).tgz
BUDIR=`cat /home/phase/backup/paths.txt | grep -Ev "^#|^$"`
DATEOLD=/home/phase/backup/backup_$(date -d '7 day ago' +%Y%m%d).tgz
LOGFILE=/home/phase/backup/backup.log
DATE=$(date +%Y-%m-%d)

echo "Starting backup script on $DATE"
echo -e "\n\nStarting backup script on $DATE\n" >> $LOGFILE

if test -e $DATEOLD ; then
rm -rf $DATEOLD
echo "Backup from $DATEOLD Removed." >> $LOGFILE
else
echo "No Backup for $DATEOLD exists. Continuing..." >> $LOGFILE
fi

echo "Starting backup of directory $BUDIR to file $OUTPUT" >> $LOGFILE
tar -cZf $OUTPUT $BUDIR

if [ $? == 0 ]; then
echo "The file:" >> $LOGFILE
echo $OUTPUT>> $LOGFILE
echo "was created as a backup for directiories:" >> $LOGFILE
echo $BUDIR >> $LOGFILE
echo "Done! Backup file succesfully created!"
echo "You can find all information about bacup in $LOGFILE"
else
echo "There was a problem creating:" >> $LOGFILE
echo $OUTPUT >> $LOGFILE
echo "as a backup for directories:" >> $LOGFILE
echo $BUDIR >> $LOGFILE
echo "Error! I can't create backup file!"
echo "You can find all information about bacup in $LOGFILE"
fi

——————–
Have fun :P