Posts Tagged crontab

Automatyzacja wykonywania kopii bezpieczeństwa przy użyciu duply i duplicity

We wpisie Tworzenie kopii zapasowej plików przy użyciu aplikacji duplicity oraz duply opisałem, w jaki sposób skonfigurować aplikację duplicity wraz ze skryptem duply w celu wykonywania kopii zapasowych. Chciałbym teraz to trochę uszczegółowić, pod kątem automatycznego wykonywania kopii zapasowej.

Zakładam, że posiadasz już skonfigurowaną aplikację duply i możesz spokojnie za jej pomocą zrobić kopię wybranych plików. Teraz czas aby to zautomatyzować przy zachowaniu takich warunków:

  • kopia zapasowa ma być wykonywana raz dziennie (przyrostowa)
  • raz w tygodniu ma zostać uruchomione robienie pełnej kopii bezpieczeństwa
  • informacje z polecenia duply i duplicty powinny być zapisane w jakimś logu
  • chcemy zostawić sobie tylko dwa najnowsze pełne backupy

Więc do dzieła :).

Na początek zacznijmy od ostatniego punktu: zostawiamy tylko dwie ostatnie kopie bezpieczeństwa. Za takie zachowanie odpowiada definicja zmiennej MAX_FULL_BACKUPS w pliku conf definiującym dany profil duply:

52
53
54
55
# Number of full backups to keep. Used for the "purge-full" command.
# See duplicity man page, action "remove-all-but-n-full".
# defaults to 1, if not set
MAX_FULL_BACKUPS=2

Ustawienie tej wartości na 2 powoduje zostawienie tylko dwóch ostatnich pełnych kopii bezpieczeństwa (oczywiście, wraz z przyrostowymi backupami).

Co warto zauważyć, stare kopie bezpieczeństwa nie zostaną automatycznie usunięte podczas robienia kopii. Należy powołać polecenie duply odpowiednim parametrem, aby zostały one usunięte:

# duply PROFIL purge-full --force

Wywołanie samego polecenia purge-full spowoduje wyświetlenie informacji o tym co ma zostać usunięte, a dodanie do tego jeszcze przełącznika --force spowoduje usunięcie starych plików.

Teraz czas na zdefiniowanie lokalizacji, gdzie będą zapisywane logi z tworzenia kopii bezpieczeństwa. Załóżmy, że mają one znaleźć się w katalogu /var/log/duply, więc:

# mkdir -p /var/log/duply

Ostatnim krokiem będzie poinformowanie aplikacji cron kiedy ma uruchomić odpowiednie skrypty. Można to zrobić poprzez odpowiednią modyfikację pliku /etc/crontab lub też dodając nowy plik z definicją do katalogu /etc/cron.d.

Wybierzmy drugą opcję, czyli należy utworzyć plik /etc/cron.d/duply o takiej zawartości:

1
2
3
4
5
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

10 2 * * 0      root    (duply PROFIL full && duply system_backup purge-full --force; duply system_backup status) 2>&1 | tee /var/log/duply/duply-$(date +\%Y\%m\%d-\%H\%M\%S).log
10 2 * * 1-6    root    (duply PROFIL backup; duply system_backup status) 2>&1 | tee /var/log/duply/duply-$(date +\%Y\%m\%d-\%H\%M\%S).log

Oto co jest zdefiniowane:

  • definicja zmiennych środowiskowych używanych podczas wywoływania skryptów, ważne jest poprawne zdefiniowanie zmiennej PATH
  • linia 4 – definicja wywołania robienia pełnej kopii bezpieczeństwa, będzie ona wykonywana w każdą niedziele o godzinie 2:10, najpierw zostanie wykonana pełna kopia, następnie zostaną usunięte stare kopie bezpieczeństwa, zostanie wypisany status archiwum i to wszystko zostanie zapisane do pliku /var/log/duply/duply-DATA-GODZINA.log, gdzie DATA i GODZINA to odpowiednio data i godzina rozpoczęcia kopii bezpieczeństwa
  • linia 5 – wykonanie przyrostowej kopii bezpieczeństwa w każdy dzień tygodnia (poza niedzielą) o godzinie 2:10, następnie statusu archiwum, i podobnie zapisanie tych informacji w logu.

Od tej pory kopie bezpieczeństwa powinny wykonywać się automatycznie o zadanych porach.

Źródła

Tags: , , , ,

Cron a dzień miesiąca i dzień tygodnia

Za uruchamianie cykliczne zadań w systemach Linuksowych odpowiada demon cron. Jego konfiguracja odbywa się poprzez plik crontab, w którym są zdefiniowane jakie zdarzenie i kiedy mają wystąpić. Dokładna dokumentacja znajduje się w pliku MAN crontab(5). Przykładowy wpis może wyglądać następująco:

30 4 1,15 * 5 root /bin/backup

Poszczególne pola definiują, kiedy dana akcja ma zostać wykonana:

  • 30 – minutę
  • 4 – godzinę
  • 1,15 – dzień miesiąca (1 lub 15)
  • * – miesiąc (gwiazdka oznacza każdego miesiąca)
  • 5 – dzień tygodnia (piątek)
  • root – użytkownik, który ma wykonać akcję
  • /bin/backup – co ma zostać wykonane

Pomiędzy poszczególnymi zapisami jest stosowany spójnik „i”, czyli zapis powyżej oznacza: wykonania skryptu /bin/backup przez użytkownika root każdego miesiąca, w piątek oraz kiedy dzień miesiąca jest równy 1 lub 15 o godzinie 4:30.

I tutaj pojawia się mała niespodzianka, ponieważ ta definicja nie jest prawdziwa.

W dokumentacji można przeczytać coś takiego:

Note: The day of a command’s execution can be specified by two fields — day of month, and day of week. If both fields are restricted (ie, aren’t *), the command will be run when either field matches the current time.

Co oznacza (w wolnym tłumaczeniu):

Dzień wykonania danej komendy może zostać podany w dwóch polach: dzień miesiąca oraz dzień tygodnia. Jeżeli oba pola są zdefiniowane (czyli są tam wartości inne wartości niż „*”) dana komenda zostanie wykonana jeżeli do aktualnego będzie pasowało jedno z tych pól.

Czy definicja powyżej oznacza: wykonania skryptu /bin/backup przez użytkownika root każdego miesiąca, w piątek lub kiedy dzień miesiąca jest równy 1 lub 15 o godzinie 4:30.

Należy zapamiętać, że jeżeli podamy oba pola, to między nimi występuje spójnik „lub”.

Źródła

Tags: , , ,