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.
Projekt z zaawansowanego skryptowania to bezpłatna lekcja Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Linux Command Line & Bash Scripting Mastery 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
doneZnajdowanie 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
doneArchiwizowanie 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
doneDodawanie 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
doneTestowanie 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,wcimv, - 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ć!
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 Linux Command Line & Bash Scripting Mastery, przejdź na CoddyKit PRO. Kurs Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery 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ąć Linux Command Line & Bash Scripting Mastery?
Nie wymagamy żadnego doświadczenia. Linux Command Line & Bash Scripting Mastery 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 Linux Command Line & Bash Scripting Mastery?
Tak. Każda lekcja Linux Command Line & Bash Scripting Mastery 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
- Planowanie zadań za pomocą Cron
- Automatyzacja administracji systemem
- Projekt z zaawansowanego skryptowania
- Automatyczna rotacja logów i czyszczenie