Scrivere uno script bash semplice per automatizzare i compiti usando cron
1. Definizione del task
Oggi scriviamo uno script pratico, che controlla la disponibilità di un sito e registra il risultato in un file di log, per poi automatizzarne l'esecuzione usando cron
.
Cosa vogliamo fare?
Creeremo uno script bash che:
- Controlla la disponibilità di un sito specifico usando
ping
. - Scrive il risultato del controllo in un file di log, includendo data e ora.
- Esegue automaticamente questo script ogni 5 minuti tramite
cron
.
Perché è importante?
Nel mondo reale, monitorare la disponibilità di siti web e server è una delle principali attività degli amministratori di sistema. Ad esempio, se il tuo sito (o server) improvvisamente smette di rispondere, vuoi saperlo il prima possibile. Questo tipo di scenario è utile non solo per il monitoraggio, ma anche durante colloqui o nella pratica lavorativa.
2. Passo 1: Scrivere un semplice script bash
Iniziamo con la scrittura dello script bash principale. Ecco una spiegazione passo passo di cosa farà lo script:
- Definiamo l'indirizzo del sito da controllare.
- Usiamo
ping
per tentare di inviare una richiesta al server. - Controlliamo se è stata ricevuta una risposta disponibile.
- Salviamo il risultato in un file di log.
Creiamo il file site_check.sh
:
#!/bin/bash
# Definiamo l'indirizzo del sito web
WEBSITE="example.com"
# File per registrare i risultati
LOG_FILE="/var/log/site_status.log"
# Controlliamo la disponibilità del sito usando ping
if ping -c 1 $WEBSITE &> /dev/null; then
# Se il sito è disponibile
echo "$(date): $WEBSITE è raggiungibile" >> $LOG_FILE
else
# Se il sito non è disponibile
echo "$(date): $WEBSITE non è raggiungibile" >> $LOG_FILE
fi
Spiegazione del codice:
#!/bin/bash
— indica che questo script deve essere eseguito usando Bash.WEBSITE="example.com"
— l'indirizzo del sito da controllare. Puoi sostituireexample.com
con qualsiasi sito o server che desideri monitorare.ping -c 1 $WEBSITE
— invia un pacchetto (-c 1
) al sito indicato. Se il sito risponde, il comando si completa con codice 0. Altrimenti, viene restituito un errore.&> /dev/null
— reindirizza l'output standard e gli errori nel "buco nero" (non vogliamo vedere l'output diping
nella console).$(date)
— aggiunge data e ora correnti al messaggio.>> $LOG_FILE
— scrive il risultato alla fine del file di log.
3. Passo 2: Avvio manuale dello script
Prima di automatizzare l'esecuzione dello script, assicuriamoci che funzioni.
Salva lo script in un file chiamato
site_check.sh
.Rendilo eseguibile:
chmod +x site_check.sh
Eseguilo:
sudo ./site_check.sh
Dopo l'esecuzione dello script, apri il file /var/log/site_status.log
per verificare che il risultato del controllo sia stato aggiunto al log. Usa il comando:
cat /var/log/site_status.log
Se tutto funziona correttamente, dovresti vedere una riga come questa:
Mon Oct 30 14:35:22 UTC 2023: example.com è raggiungibile
4. Passo 3: Configurazione dell'esecuzione automatica con cron
Sappiamo già che cron
consente di eseguire attività pianificate. Ora configureremo cron
, in modo che il nostro script venga eseguito ogni 5 minuti.
Modifica del crontab
Apri l'editor di crontab
:
crontab -e
Aggiungi la seguente riga:
*/5 * * * * /path/to/site_check.sh
Spiegazione:
*/5
— indica che l'attività deve essere eseguita ogni 5 minuti./path/to/site_check.sh
— il percorso completo del nostro script. Assicurati che sia corretto. Ad esempio, se lo script si trova nella directory home dell'utente, il percorso sarà qualcosa come/home/your_username/site_check.sh
.
Dopo aver salvato le modifiche, cron
inizierà a eseguire lo script ogni 5 minuti. Per verificare che l'attività sia stata aggiunta, esegui:
crontab -l
5. Passo 4: Testare il funzionamento di cron
Ora vediamo se l'automazione funziona. Aspetta 5-10 minuti e riapri il file dei log:
cat /var/log/site_status.log
Dovresti vedere nuove righe che si aggiornano ogni 5 minuti. Per esempio:
Mon Oct 30 14:35:22 UTC 2023: example.com è raggiungibile
Mon Oct 30 14:40:22 UTC 2023: example.com è raggiungibile
Mon Oct 30 14:45:22 UTC 2023: example.com è raggiungibile
6. Analisi di domande ed errori comuni
Ping restituisce errore 'Permission denied'
Se esegui lo script come utente normale, potrebbe non avere abbastanza permessi. Esegui lo script con
sudo
oppure aggiungi i permessi di esecuzione.Il file di log non viene creato
Assicurati che il percorso al file di log (
/var/log/site_status.log
) sia corretto e che il tuo utente abbia i permessi di scrittura in questa directory. Se il file non esiste, crealo manualmente usando:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.log
cron
non avvia lo scriptVerifica se il servizio
cron
è attivo:sudo systemctl status cron
Dovrebbe essere nello stato
active (running)
. Se è fermo, avvialo:sudo systemctl start cron
Lo script non viene eseguito da cron, ma funziona manualmente
Assicurati che il percorso dello script e di tutti i file utilizzati sia scritto completamente. Nei task
cron
, le variabili di ambiente (ad esempio$PATH
) possono essere diverse. È meglio usare percorsi assoluti.
7. Miglioramenti e compiti aggiuntivi
Filtraggio dei siti web
Espandi lo script in modo che controlli la disponibilità di più siti. Per esempio:
WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
if ping -c 1 $SITE &> /dev/null; then
echo "$(date): $SITE è raggiungibile" >> $LOG_FILE
else
echo "$(date): $SITE non è raggiungibile" >> $LOG_FILE
fi
done
Invio di notifiche
Aggiungi l'invio di notifiche se un sito non è disponibile. Ad esempio, usando il comando mail
per inviare un'email:
# Notifica via email
if ! ping -c 1 $WEBSITE &> /dev/null; then
echo "$WEBSITE non è raggiungibile!" | mail -s "Website Check Alert" your_email@example.com
fi
Logging ciclico
Limita la dimensione del file di log a, ad esempio, 1 MB. Se il file diventa troppo grande, rinominalo (come archivio) e avvia un nuovo log.
Congratulazioni! Ora sai come usare gli script bash e cron
per automatizzare compiti reali. Queste competenze sono particolarmente richieste per i DevOps ingegneri e gli amministratori di sistema.
GO TO FULL VERSION