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 jestset -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 dofile.command 2> file: Przekierowuje stderr dofile.
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.logCał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 dofile, 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
- Wprowadzenie do skryptów Bash
- Automatyzacja zadań serwera
- Obsługa błędów i logowanie w skryptach
- Funkcje, argumenty i skrypty wielokrotnego użytku