0Pricing
Linux Server Deployment & SSH Mastery · Lezione

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 (se set -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 verso file.
  • command 2> file: reindirizza stderr verso file.

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.log

Tutto 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 verso file, 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

  1. Introduzione allo scripting Bash
  2. Automazione delle attività del server
  3. Gestione degli errori e logging negli script
  4. Funzioni, argomenti e script riutilizzabili
← Torna a Linux Server Deployment & SSH Mastery