0Pricing
Linux Server Deployment & SSH Mastery · Lekcja

Obsługa błędów i logowanie w skryptach

Zaimplementuj solidną obsługę błędów, przekierowuj dane wyjściowe skryptów i generuj przydatne logi do monitorowania ich wykonywania oraz rozwiązywania problemów.

Obsługa błędów i logowanie w skryptach to bezpłatna lekcja Linux Server Deployment & SSH 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 Server Deployment & SSH Mastery, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Linux Server Deployment & SSH Mastery zawiera 4 lekcji w sumie.

Tworzenie niezawodnych skryptów

Wyobraź sobie, że Twój skrypt działa na serwerze i wykonuje ważne zadanie. Co się stanie, jeśli coś pójdzie nie tak?

  • Czy zakończy działanie bez żadnego komunikatu?
  • Czy pozostawi po sobie bałagan?
  • Czy będzie można określić, kiedy i dlaczego wystąpił błąd?

Niezawodne skrypty prawidłowo obsługują błędy i generują przejrzyste logi. W tej lekcji dowiesz się, jak to osiągnąć!

Zrozumienie kodów wyjścia

Każde polecenie i każdy skrypt w systemie Linux zwraca po zakończeniu kod wyjścia (lub status wyjścia). Ta liczba informuje, czy operacja zakończyła się powodzeniem, czy niepowodzeniem.

  • 0: Oznacza powodzenie! Wszystko przebiegło prawidłowo.
  • 1-255: Oznacza niepowodzenie. Konkretna liczba może wskazywać rodzaj błędu.

Zobaczmy, jak to działa w praktyce:

#!/bin/bash
# This script demonstrates exit codes

echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"

echo

echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"

Sprawdzanie statusu polecenia

Po wykonaniu dowolnego polecenia można sprawdzić jego kod wyjścia za pomocą specjalnej zmiennej $?. Jest to bardzo przydatne podczas podejmowania decyzji w skrypcie.

Można użyć instrukcji if, aby odpowiednio zareagować na powodzenie lub niepowodzenie:

#!/bin/bash
# Check if a file exists before trying to read it

FILENAME="test_file.txt"
touch $FILENAME # Create it for success case

if [ -f "$FILENAME" ]; then
  echo "File '$FILENAME' exists. Processing..."
  # ... do something with the file ...
  rm $FILENAME # Clean up
else
  echo "Error: File '$FILENAME' not found!"
  exit 1
fi

echo "Script finished."

`set -e`: zakończenie działania po błędzie

W przypadku prostych skryptów ręczne sprawdzanie $? w każdym miejscu może być uciążliwe. Polecenie set -e zmienia sposób działania skryptu:

  • Jeśli dowolne polecenie zakończy się niezerowym statusem (czyli wystąpi błąd), skrypt natychmiast kończy działanie.
  • Zapobiega to kontynuowaniu pracy przez skrypt z potencjalnie uszkodzonymi danymi lub w nieprawidłowym stanie.

Uruchom ten skrypt. Co się stanie, jeśli polecenie cp zakończy się błędem?

#!/bin/bash
set -e

echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail

echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."

`trap` do sprzątania

Czasami nawet po wystąpieniu błędu skrypt musi wykonać zadania porządkowe, takie jak usunięcie plików tymczasowych. Polecenie trap umożliwia przechwytywanie sygnałów (takich jak zakończenie działania lub błąd) i uruchamianie polecenia.

  • EXIT: Jest wykonywane przy zakończeniu działania skryptu, niezależnie od tego, czy zakończył się on powodzeniem, czy niepowodzeniem.
  • ERR: Jest wykonywane, gdy polecenie zakończy się niezerowym statusem (jeśli aktywne jest set -e).

W tym przykładzie upewniamy się, że katalog tymczasowy zostanie zawsze usunięty:

#!/bin/bash

TEMP_DIR="/tmp/my_script_temp_$(date +%s)"

function cleanup {
  echo "Cleaning up temporary directory: $TEMP_DIR"
  rm -rf "$TEMP_DIR"
}

trap cleanup EXIT

mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure

echo "Script completed."

Przekierowywanie danych wyjściowych

Podczas działania skrypt często wyświetla komunikaty. Dzielą się one na dwa główne typy:

  • Standardowe wyjście (stdout): Zwykłe komunikaty (deskryptor pliku 1).
  • Standardowe wyjście błędów (stderr): Komunikaty o błędach (deskryptor pliku 2).

Można przekierować te strumienie do plików zamiast wyświetlać je na ekranie:

  • command > file: Przekierowuje stdout do file.
  • command 2> file: Przekierowuje stderr do file.

Zapiszmy osobno komunikaty o powodzeniu i błędach.

#!/bin/bash
# Redirect stdout to success.log and stderr to error.log

echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log

echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.log

Całe dane wyjściowe w jednym pliku

Często warto zapisywać zarówno standardowe wyjście, jak i standardowe wyjście błędów w jednym pliku dziennika, aby ułatwić analizę. Można to zrobić na kilka sposobów:

  • command > file 2>&1: Przekierowuje stdout do file, a następnie przekierowuje stderr tam, dokąd kierowany jest stdout (czyli do pliku).
  • command &> file: Krótsza, nowocześniejsza składnia oznaczająca to samo.

To świetne rozwiązanie do tworzenia pełnego logu z działania skryptu.

#!/bin/bash
# Redirect both stdout and stderr to a single log file

LOG_FILE="combined_script.log"

echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"

echo "Check the '$LOG_FILE' file for all output."

Dodawanie znaczników czasu do logów

Podczas debugowania kluczowe znaczenie ma wiedza, kiedy dane zdarzenie miało miejsce. Dodanie znaczników czasu do komunikatów w logu sprawia, że stają się one znacznie bardziej użyteczne.

Do każdego wpisu w logu można dodać na początku bieżącą datę i godzinę za pomocą polecenia date. Ułatwia to śledzenie zdarzeń w kolejności chronologicznej.

#!/bin/bash

LOG_FILE="timestamped_script.log"

function log_message {
  echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}

log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."

echo "Check '$LOG_FILE' for timestamped entries."

Wysyłanie do logów systemowych za pomocą `logger`

W przypadku ważnych zdarzeń można wysyłać komunikaty bezpośrednio do systemowego mechanizmu logowania (syslog). Służy do tego polecenie logger.

  • Logi systemowe są często obsługiwane przez narzędzia takie jak journalctl (w systemach korzystających z systemd).
  • Dzięki temu ważne komunikaty skryptu są gromadzone razem z innymi zdarzeniami systemowymi.
  • Jest to przydatne w przypadku krytycznych błędów lub ścieżek audytowych.

Komunikaty wysłane za pomocą logger można znaleźć przy użyciu journalctl -f lub tail -f /var/log/syslog (zależnie od systemu).

#!/bin/bash
# Send a message to system logs

SCRIPT_NAME="MyBackupScript"

logger -t "$SCRIPT_NAME" "Starting daily backup operation."

# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
  logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
  logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi

echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."

Sprawdzian z obsługi błędów

Napisano skrypt Bash do przetwarzania plików. Skrypt ma kończyć działanie natychmiast po niepowodzeniu dowolnego zawartego w nim polecenia, a katalog tymczasowy ma być usuwany niezależnie od sposobu zakończenia skryptu.

Jakich dwóch poleceń Bash należy przede wszystkim użyć, aby to osiągnąć?

Podsumowanie i dalsze kroki

Dowiedziałeś się, jak tworzyć bardziej niezawodne skrypty Bash, które łatwiej debugować!

  • Kody wyjścia: Pozwalają określić, czy polecenie zakończyło się powodzeniem, czy niepowodzeniem.
  • set -e: Automatycznie kończy działanie po wystąpieniu błędu.
  • trap: Wykonuje czynności porządkowe przy zakończeniu działania skryptu.
  • Przekierowywanie danych wyjściowych: Umożliwia określenie, dokąd trafiają stdout i stderr.
  • Znaczniki czasu: Dodają kontekst do logów.
  • logger: Integruje skrypt z systemowym mechanizmem logowania.

Stosowanie tych technik sprawi, że zadania automatyczne będą bardziej niezawodne i łatwiejsze w zarządzaniu. Ćwicz dalej, aby tworzyć naprawdę odporne rozwiązania automatyzujące!

Często zadawane pytania

Czy lekcja „Obsługa błędów i logowanie w skryptach” jest bezpłatna?

Tak — pełny tekst „Obsługa błędów i logowanie w skryptach” 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 Server Deployment & SSH Mastery, przejdź na CoddyKit PRO. Kurs Linux Server Deployment & SSH Mastery zawiera 4 lekcji w sumie.

Co nauczysz się w „Obsługa błędów i logowanie w skryptach”?

Zaimplementuj solidną obsługę błędów, przekierowuj dane wyjściowe skryptów i generuj przydatne logi do monitorowania ich wykonywania oraz rozwiązywania problemów. Ćwiczysz Linux Server Deployment & SSH 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 Server Deployment & SSH Mastery?

Nie wymagamy żadnego doświadczenia. Linux Server Deployment & SSH 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 „Obsługa błędów i logowanie w skryptach”?

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 Server Deployment & SSH Mastery?

Tak. Każda lekcja Linux Server Deployment & SSH 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

  1. Wprowadzenie do skryptów Bash
  2. Automatyzacja zadań serwera
  3. Obsługa błędów i logowanie w skryptach
  4. Funkcje, argumenty i skrypty wielokrotnego użytku
← Powrót do Linux Server Deployment & SSH Mastery