Skrypt o nazwie /root/backup.sh
na w01, który utworzy kopię zapasową zawartości / home
Skrypt będzie:
- Utwórz archiwum tar o nazwie
/share/<YYYY><MM><DD>_w01.tar
gdzie- RRRR oznacza rok bieżący (tj. 2014 r.)
- MM oznacza bieżący miesiąc (tj. 11)
- DD oznacza bieżący dzień miesiąca (tj. 22)
- Loguj sukces i błędy
/tmp/backup.log
- Wyjdź z niezerowym kodem powrotu, jeśli napotkasz błąd
Odpowiedzi:
Głównymi czynnikami, które trzeba będzie połączyć ze sobą, są następujące elementy (polecam napisanie każdego z nich jako oddzielnego fragmentu kodu, przetestowanie go, a następnie umieszczenie go razem, gdy będziesz szczęśliwy):
Nazwy plików (tj. używając aktualnej daty w nazwie tarballa):
Jak stwierdzono w innej odpowiedzi,
man date
udzieli ci pomocy, skup się na sekcji formatu (npdate +%Y%m
...)Wycięcie lasu (tj. zapisanie danych wyjściowych tar do pliku, do którego można się odwołać później):
Pierwszą rzeczą, którą musisz zdecydować, to jak długo zapisać dziennik, czy chcesz tam próbować poprzedniego dnia, czy tylko ostatnie? Jeśli zapisujesz wiele dni, będziesz chciał dołączyć znacznik danych na górze każdego nowego biegu, abyś mógł zobaczyć, gdzie kończy się kolejny, i następny.
echo "here's a command" > /tmp/backup.log
nadpisze zawartość pliku /tmp/backup.log i wstawi w to miejsce ciąg „tutaj jest polecenie”.echo "here's a command" >> /tmp/backup.log
zachowa wszelkie istniejące dane w /tmp/backup.log i doda „tutaj jest polecenie” do końca.tar -cvf /share/foo.tar /home > /tmp/backup.log
umieści w dzienniku tylko STDOUT (tj. zwykłe wyjście „ja tarowałem” te pliki), ale żadne błędy nie zostaną przechwycone.tar -cvf /share/foo.tar /home 2> /tmp/backup.log
umieści w dzienniku tylko STDERR (tzn. tylko błędy).tar -cvf /share/foo.tar /home > /tmp/backup.log 2>&1
umieści zarówno STDOUT, jak i STDERR w dzienniku.Połącz je, aby utworzyć dokładnie odpowiedni zestaw danych w dzienniku.
Obsługa błędów (tj. co zrobić, jeśli tar zwróci błąd:
Szybki i brudny sposób reagowania na błędy w poleceniu polega na dodaniu
|| command_to_run_if_error
po twoim rozkazie. Zasadniczo mówi się „Uruchom te polecenia, aby się udało”, możesz również użyć&& command_to_run_if_success
co jest jak powiedzenie „Uruchom te polecenia w porządku, aż jeden się nie powiedzie”.command1 || command2
Uruchomi polecenie1, a jeśli się nie powiedzie (niezerowy kod wyjścia) uruchomi polecenie2. Jeśli się powiedzie, polecenie2 nie zostanie uruchomione.command1 && command2
Uruchomi polecenie1, a jeśli się nie powiedzie, zatrzyma się i nie uruchomi polecenia2. Jeśli komenda1 powiedzie się, tylko komenda2 zostanie uruchomiona.if .. then .. else .. fi
na przykład
echo "About to run command1" >> logfile.log
if command1 >> logfile.log
then
echo "All went well" >> logfile.log
else
echo "Something went wrong! ABORTING" >> logfile.log
run_some_cleanup_command
exit 1
fi
Połącz je, aby nauczyć swój skrypt, co robić w każdym przypadku awarii.
Kilka innych rzeczy, o których należy pamiętać:
Czy chcesz sprawdzić, czy jest miejsce na / share, aby pasowało do twojego tarballa zanim to zrobisz?
Rozważ użycie
du -sk /home
aby zobaczyć ile KB musi wykonać kopię zapasową i porównać to z ilością wolnego miejsca wdf -k /share
. Możesz używać poleceń powłoki takich jak[ $space_on_share -lt $data_in_home ] || exit 1
aby przerwać, a nie zużyć całe wolne miejsce (prawdopodobnie chciałbyś, aby rejestrował coś pomocnego niż po prostu wyjdź).Czy chcesz wykonać kopię zapasową wszystko w domu?
Zastanów się nad listą rzeczy do wykluczenia, aby zaoszczędzić miejsce lub chronić Prywatność.
Czy rozważałeś użycie kompresji w celu zaoszczędzenia miejsca?
niektóre wersje tar akceptują
-z
aby użyć kompresji gzip, lub możesz określić STDOUT jako nazwapliku, a następnie potokuj wyjście przez gzip (tar -cf - /home | gzip -c > /share/foo.tar.gz
)źródło
Kluczem do rozpoczęcia dowolnego problemu ze skryptowaniem jest rozbicie go na małe kawałki. Koduj i przetestuj pierwsze małe kawałki przed dodaniem większej liczby funkcji.
Na przykład
krok 1
Możesz zacząć od napisania skryptu, który drukuje „Rozpoczęcie kopii zapasowej” i nie robi nic innego.
krok 2
Kiedy to działa, zmień go, aby przypisać wyjście
date
polecenie do zmiennej powłoki (np.$today
) i wydrukuj zawartość tej zmiennej.krok 3
Gdy krok 2 jest w pełni przetestowany i działa, przeglądaj
man date
i zobacz, jak zmienić wyjście, aby uzyskać „& lt; YYYY & gt; & lt; MM & gt; & lt; DD & gt;” żądany format wyjściowy.i tak dalej. Jeśli utkniesz w dowolnym momencie, wyszukaj SuperUser (itp.) W tym konkretnym, drobnym, dobrze zorientowanym pytaniu, aby sprawdzić, czy istnieje istniejąca odpowiedź. Jeśli nie, napisz starannie skomponowane, ściśle zogniskowane pytanie, pokazujące, co zrobiłeś, co zrobiłeś i co chciałeś zrobić. pokaż kod uruchamialny, ale usuń wszystkie obce materiały.
źródło