Gestione degli errori e logging negli script
Implementi una gestione robusta degli errori, reindirizzi l'output degli script e generi log significativi per monitorarne l'esecuzione e risolvere i problemi.
Gestione degli errori e logging negli script è una lezione Linux Server Deployment & SSH Mastery gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Linux Server Deployment & SSH Mastery, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Linux Server Deployment & SSH Mastery include 4 lezioni in totale.
Rendete affidabili i vostri script
Immaginate che il vostro script venga eseguito su un server per svolgere un'attività importante. Cosa succede se qualcosa va storto?
- Si interrompe senza segnalare nulla?
- Lascia dei problemi da risolvere?
- Potete capire quando e perché si è verificato l'errore?
Gli script robusti gestiscono gli errori in modo appropriato e producono log chiari. Questa lezione vi insegnerà come fare!
Capire i codici di uscita
Ogni comando e script in Linux restituisce un codice di uscita (o stato di uscita) al termine dell'esecuzione. Questo numero indica se l'operazione è riuscita o meno.
0: indica il successo. È andato tutto bene.1-255: indica un errore. Un numero specifico può indicare il tipo di errore.
Vediamo come funziona:
#!/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': $?"Controllare lo stato di un comando
Dopo l'esecuzione di un comando, potete controllarne il codice di uscita usando la variabile speciale $?. È molto utile per prendere decisioni nello script.
Potete usare un'istruzione if per reagire al successo o all'errore:
#!/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`: uscire in caso di errore
Negli script semplici, controllare manualmente $? in ogni punto può essere noioso. Il comando set -e modifica il comportamento dello script:
- Se un comando termina con uno stato diverso da zero (quindi non riesce), lo script termina immediatamente.
- In questo modo si impedisce allo script di continuare con dati potenzialmente corrotti o in uno stato non valido.
Provate a eseguire questo script. Cosa succede se il comando cp non riesce?
#!/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` per la pulizia
A volte, anche se uno script non riesce, è necessario eseguire operazioni di pulizia, come rimuovere i file temporanei. Il comando trap consente di intercettare segnali (come un'uscita o un errore) ed eseguire un comando.
EXIT: viene eseguito quando lo script termina, indipendentemente dal successo o dall'errore.ERR: viene eseguito quando un comando termina con uno stato diverso da zero (seset -eè attivo).
In questo caso, ci assicuriamo che una directory temporanea venga sempre rimossa:
#!/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."Reindirizzare l'output
Quando lo script viene eseguito, spesso stampa dei messaggi. Questi sono principalmente di due tipi:
- Output standard (stdout): messaggi normali (descrittore di file 1).
- Errore standard (stderr): messaggi di errore (descrittore di file 2).
Potete reindirizzare questi flussi verso i file invece che sullo schermo:
command > file: reindirizza stdout versofile.command 2> file: reindirizza stderr versofile.
Salviamo separatamente i messaggi di successo e quelli di errore.
#!/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.logTutto l'output in un unico file
Spesso è utile avere sia l'output standard sia l'errore standard in un unico file di log, per facilitarne la revisione. Esistono un paio di modi per farlo:
command > file 2>&1: reindirizza stdout versofile, quindi reindirizza stderr verso la destinazione di stdout (il file).command &> file: una sintassi più breve e moderna per ottenere lo stesso risultato.
È ideale per creare un log completo dell'esecuzione dello script.
#!/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."Aggiungere i timestamp ai log
Durante il debug, sapere quando si è verificato un evento è fondamentale. Aggiungere i timestamp ai messaggi di log li rende molto più utili.
Potete anteporre la data e l'ora correnti a ogni voce del log usando il comando date. Questo aiuta a ricostruire gli eventi in ordine cronologico.
#!/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."Inviare i messaggi ai log di sistema con `logger`
Per gli eventi importanti, potreste voler inviare i messaggi direttamente al sistema di logging del sistema (syslog). Il comando logger fa esattamente questo.
- I log di sistema sono spesso gestiti da strumenti come
journalctl(nei sistemi systemd). - In questo modo i messaggi importanti dello script vengono raccolti insieme agli altri eventi di sistema.
- È utile per gli errori critici o per le tracce di audit.
I messaggi inviati con logger possono essere visualizzati usando journalctl -f o tail -f /var/log/syslog (a seconda del sistema).
#!/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'."Verifica della gestione degli errori
Avete scritto uno script Bash per elaborare alcuni file. Volete che lo script termini immediatamente se un comando al suo interno non riesce e volete anche assicurarvi che una directory temporanea venga pulita indipendentemente dal modo in cui termina lo script.
Quali due comandi Bash usereste principalmente per ottenere questo risultato?
Riepilogo e prossimi passi
Avete imparato a rendere gli script Bash più robusti e più facili da sottoporre a debug.
- Codici di uscita: capire se un comando è riuscito o meno.
set -e: terminare automaticamente in caso di errore.trap: eseguire operazioni di pulizia quando termina lo script.- Reindirizzamento dell'output: controllare la destinazione di stdout e stderr.
- Timestamp: aggiungere contesto ai log.
logger: integrare lo script con il logging dell'intero sistema.
Applicando queste tecniche, le vostre attività automatizzate saranno più affidabili e gestibili. Continuate a esercitarvi per creare automazioni davvero resilienti!
Domande Frequenti
La lezione «Gestione degli errori e logging negli script» è gratuita?
Sì — il testo completo di «Gestione degli errori e logging negli script» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Linux Server Deployment & SSH Mastery, passa a CoddyKit PRO. Il corso Linux Server Deployment & SSH Mastery include 4 lezioni in totale.
Cosa imparerò in «Gestione degli errori e logging negli script»?
Implementi una gestione robusta degli errori, reindirizzi l'output degli script e generi log significativi per monitorarne l'esecuzione e risolvere i problemi. Eserciti Linux Server Deployment & SSH Mastery con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Linux Server Deployment & SSH Mastery?
Non è richiesta alcuna esperienza precedente. Linux Server Deployment & SSH Mastery su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Gestione degli errori e logging negli script»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Linux Server Deployment & SSH Mastery?
Sì. Ogni lezione Linux Server Deployment & SSH Mastery include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Introduzione allo scripting Bash
- Automazione delle attività del server
- Gestione degli errori e logging negli script
- Funzioni, argomenti e script riutilizzabili