DevOps Bootcamp · Lekcja

Projekt z zaawansowanego skryptowania

Zrealizuje Pan/Pani kompleksowy projekt łączący wszystkie poznane zagadnienia — od narzędzi wiersza poleceń po zaawansowane techniki skryptowania w Bash.

Lekcja 3 z 412 kroki

Projekt z zaawansowanego skryptowania to bezpłatna lekcja DevOps Bootcamp na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej DevOps Bootcamp, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs DevOps Bootcamp zawiera 4 lekcji w sumie.

Początek projektu: wyzwanie

Witaj w naszym projekcie końcowym! W trakcie tego kursu poznawałeś wiele przydatnych poleceń systemu Linux i technik tworzenia skryptów Bash. Teraz czas połączyć je wszystkie.

W tej lekcji od podstaw stworzymy praktyczny, zaawansowany skrypt Bash. Projekt będzie wymagał połączenia wszystkiego, czego się nauczyłeś, w jedno działające rozwiązanie.

Określenie celu projektu

Naszym celem jest utworzenie skryptu monitorującego pliki i archiwizującego je. Wyobraź sobie serwer, który generuje pliki dzienników, a Ty musisz regularnie je przetwarzać bez ręcznej ingerencji.

Nasz skrypt będzie:

  • ciągle monitorować określony katalog pod kątem nowych plików tekstowych;
  • przetwarzać każdy nowy plik (np. zliczać jego wiersze);
  • przenosić przetworzony plik do katalogu archiwum;
  • rejestrować wszystkie działania, w tym znaczniki czasu i ewentualne błędy.

Podstawa skryptu: Shebang i zmienne

Każdy dobry skrypt zaczyna się od solidnej podstawy. Zaczniemy od zdefiniowania shebang i skonfigurowania kluczowych zmiennych. Dzięki nim skrypt będzie elastyczny i łatwy w konfiguracji.

Zdefiniujemy ścieżki do katalogu monitorowanego, katalogu archiwum i pliku dziennika.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

Upewnianie się, że katalogi istnieją

Zanim skrypt zacznie monitorować lub archiwizować pliki, musimy upewnić się, że wymagane katalogi istnieją. Użycie mkdir -p ma tu kluczowe znaczenie, ponieważ tworzy katalogi tylko wtedy, gdy jeszcze nie istnieją, i nie zgłasza błędu, jeśli już istnieją.

Dodamy również podstawową obsługę błędów, aby skrypt kończył działanie w kontrolowany sposób, jeśli utworzenie katalogów się nie powiedzie.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

Pętla monitorowania

Nasz skrypt musi działać bez przerwy, aby wykrywać nowe pliki. Doskonale nadaje się do tego pętla while true. Wewnątrz pętli użyjemy sleep, aby robić kilkusekundowe przerwy między sprawdzeniami i zapobiec nadmiernemu zużyciu zasobów.

Będziemy również rejestrować każde sprawdzenie, aby śledzić aktywność.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # File processing will go here
  sleep 5 # Check every 5 seconds
done

Znajdowanie i przetwarzanie plików

Wewnątrz naszej pętli musimy znajdować nowe pliki tekstowe. Polecenie find idealnie się do tego nadaje — połączymy je z pętlą for, aby przetwarzać każdy znaleziony plik. Jako etap przetwarzania użyjemy wc -l do zliczania wierszy w każdym pliku.

To pokazuje, jak łączyć narzędzia wiersza poleceń w skrypcie.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  # Find new .txt files and process them
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then # Double-check if it's a regular file
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      # Archiving will go here
    fi
  done
  sleep 5 # Check every 5 seconds
done

Archiwizowanie przetworzonych plików

Po przetworzeniu pliku musimy przenieść go do katalogu archiwum. Służy do tego polecenie mv. Dodamy również instrukcję if, aby sprawdzać kod zakończenia polecenia mv, potwierdzać pomyślne przeniesienie i rejestrować wszelkie błędy.

Zwiększa to niezawodność naszego skryptu.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

Dodawanie kontrolowanego kończenia za pomocą trap

Długotrwale działający skrypt potrzebuje sposobu na bezpieczne zakończenie pracy. Polecenie trap pozwala przechwytywać sygnały, takie jak SIGINT (wyzwalany przez Ctrl+C), i wykonywać funkcję czyszczącą przed zakończeniem. Dzięki temu skrypt rejestruje swoje zamknięcie.

To kluczowy krok w tworzeniu skryptów gotowych do użycia w środowisku produkcyjnym.

#!/bin/bash

# --- Configuration Variables ---
MONITOR_DIR="/tmp/coddykit_monitor"
ARCHIVE_DIR="/tmp/coddykit_archive"
LOG_FILE="/tmp/coddykit_script.log"

# --- Functions ---
cleanup() {
  echo "$(date): Script received stop signal. Exiting gracefully." >> "$LOG_FILE"
  exit 0 # Exit with success status
}

# --- Trap Signals ---
# Trap SIGINT (Ctrl+C) and call the cleanup function
trap cleanup SIGINT

# Log script start
echo "$(date): Script initialized." >> "$LOG_FILE"

# Ensure monitoring and archive directories exist
mkdir -p "$MONITOR_DIR" || { echo "$(date): ERROR: Cannot create $MONITOR_DIR. Exiting." >> "$LOG_FILE"; exit 1; }
mkdir -p "$ARCHIVE_DIR" || { echo "$(date): ERROR: Cannot create $ARCHIVE_DIR. Exiting." >> "$LOG_FILE"; exit 1; }

echo "$(date): Directories checked/created." >> "$LOG_FILE"

# --- Main Monitoring Loop ---
while true; do
  echo "$(date): Checking for new files in $MONITOR_DIR..." >> "$LOG_FILE"
  for file in $(find "$MONITOR_DIR" -maxdepth 1 -type f -name "*.txt"); do
    if [ -f "$file" ]; then
      LINE_COUNT=$(wc -l < "$file")
      echo "$(date): Found '$file'. Lines: $LINE_COUNT." >> "$LOG_FILE"
      
      mv "$file" "$ARCHIVE_DIR/"
      if [ $? -eq 0 ]; then
        echo "$(date): Moved '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      else
        echo "$(date): ERROR: Failed to move '$file' to '$ARCHIVE_DIR'." >> "$LOG_FILE"
      fi
    fi
  done
  sleep 5
done

Testowanie zaawansowanego skryptu

Teraz, gdy nasz skrypt jest ukończony, czas go przetestować! Zwykle uruchamia się go w tle (np. ./monitor.sh &), a następnie tworzy pliki testowe w katalogu $MONITOR_DIR i obserwuje $LOG_FILE oraz $ARCHIVE_DIR.

Poniżej znajduje się krótki skrypt, który można uruchomić, aby łatwo utworzyć plik testowy dla naszego monitora.

#!/bin/bash
# create_test_file.sh

MONITOR_DIR="/tmp/coddykit_monitor"
mkdir -p "$MONITOR_DIR" # Ensure dir exists for this test script

# Create a unique test file
TEST_FILE="$MONITOR_DIR/test_log_$(date +%Y%m%d_%H%M%S).txt"
echo "This is a test entry." > "$TEST_FILE"
echo "Another line for testing." >> "$TEST_FILE"
echo "Created new test file: $TEST_FILE"

Przegląd logiki skryptu

Nasz zaawansowany skrypt łączy wiele różnych koncepcji. Przyjrzyjmy się krótko najważniejszym poleceniom i strukturom, których użyliśmy.

Proszę zastanowić się, jaką rolę odgrywa każde polecenie w realizacji celu naszego projektu.

Dalej: harmonogramowanie i dostosowywanie

Ten skrypt jest przeznaczony do ciągłego działania. W rzeczywistym scenariuszu można uruchomić go w tle za pomocą nohup ./script.sh & albo, co częstsze, zaplanować jego okresowe uruchamianie za pomocą Cron.

Proszę pamiętać, że Cron doskonale nadaje się do automatyzowania takich zadań. Można zaplanować uruchamianie skryptu co kilka minut, aby sprawdzał katalog i w razie potrzeby przetwarzał pliki.

Proszę rozważyć dostosowanie skryptu tak, aby:

  • przetwarzał inne typy plików,
  • wykonywał inne działania (np. kompresował pliki lub przesyłał je do chmury),
  • dodawał bardziej zaawansowane raportowanie błędów (np. alerty e-mail).

Podsumowanie projektu i kolejne kroki

Gratulacje! Ukończyli Państwo zaawansowany projekt skryptu Bash, integrujący szeroki zestaw poleceń systemu Linux i technik skryptowych.

Nauczyli się Państwo:

  • tworzyć strukturę niezawodnego, długotrwale działającego skryptu,
  • używać zmiennych do konfiguracji,
  • implementować pętle do ciągłego monitorowania,
  • łączyć polecenia takie jak find, wc i mv,
  • dodawać obsługę błędów i kontrolowane kończenie za pomocą trap.

Ten projekt stanowi solidną podstawę do tworzenia bardziej złożonych rozwiązań automatyzujących. Proszę dalej eksperymentować i budować!

Bezpłatny start

Ucz się DevOps Bootcamp dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
142
Lekcje
568

Często zadawane pytania

Czy lekcja „Projekt z zaawansowanego skryptowania” jest bezpłatna?

Tak — pełny tekst „Projekt z zaawansowanego skryptowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu DevOps Bootcamp, przejdź na CoddyKit PRO. Kurs DevOps Bootcamp zawiera 4 lekcji w sumie.

Co nauczysz się w „Projekt z zaawansowanego skryptowania”?

Zrealizuje Pan/Pani kompleksowy projekt łączący wszystkie poznane zagadnienia — od narzędzi wiersza poleceń po zaawansowane techniki skryptowania w Bash. Ćwiczysz DevOps Bootcamp z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć DevOps Bootcamp?

Nie wymagamy żadnego doświadczenia. DevOps Bootcamp w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Projekt z zaawansowanego skryptowania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji DevOps Bootcamp?

Tak. Każda lekcja DevOps Bootcamp zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Planowanie zadań za pomocą Cron
  2. Automatyzacja administracji systemem
  3. Projekt z zaawansowanego skryptowania
  4. Automatyczna rotacja logów i czyszczenie
← Powrót do DevOps Bootcamp