Jak mogę utworzyć skrypt w Uniksie z następującymi wymaganiami? [Zamknięte]

-2

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
Dhrumit Patel
źródło
2
Witamy w SU! Nie jesteśmy usługą pisania skryptów. Możemy i pomożemy Ci w określonych problemach w twoim skrypcie; Ale żeby to zrobić, musimy wiedzieć, co masz do tej pory i dokładnie, gdzie utkniesz podczas implementacji skryptu.
Ƭᴇcʜιᴇ007
Dziękuję za to. Właściwie chodzi o to, że trudno mi zrozumieć, o co tak naprawdę prosi. Dlatego poprosiłem tutaj o napisanie mi skryptu, dzięki czemu będę w stanie zrozumieć i napisać inne skrypty samodzielnie. # Ƭᴇcʜιᴇ007
Dhrumit Patel
„Trudno mi zrozumieć, o co tak naprawdę prosi”. Mam ten sam problem z twoim pytaniem. :) Co to jest „to” w tym zdaniu? Jeśli chodzi o naukę pisania skryptów, jest na to mnóstwo zasobów online ten , i ten , na przykład.
Ƭᴇcʜιᴇ007
Tak, wiem ... Ale mówię o tym konkretnym scenariuszu. Skrypt dotyczy tworzenia kopii zapasowej zawartości domu na stacji roboczej. Czy możesz dać mi początek, jeśli to możliwe?
Dhrumit Patel

Odpowiedzi:

4

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 (np date +%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.
    • Bardziej kompletny program obsługi błędów można utworzyć za pomocą 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 w df -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 )

Smiling Dragon
źródło
2

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.

RedGrittyBrick
źródło