Avete un server che ogni settimana va in crash perché qualcuno dimentica di fare un backup? Oppure passate ore a ripetere gli stessi comandi su decine di macchine? Noi, di Meteora Web, lo vediamo tutti i giorni: piccole e medie imprese che usano Linux ma trattano la riga di comando come un ripiego, quando invece è il loro più grande acceleratore di produttività.
Da otto anni gestiamo server, deploy e automazioni per clienti in tutta Italia. Siamo nati contabili prima che ingegneri, quindi quando parliamo di automazione parliamo di tempo risparmiato = soldi guadagnati. Un minuto di lavoro manuale ripetuto cento volte è un costo che potresti eliminare con uno script di 5 righe.
Questa pillar page è il nostro punto di riferimento su shell scripting e automazione Linux – nessuna teoria astratta, solo strumenti reali e decisioni concrete. Affronteremo Bash, cron, SSH, sed e awk, systemd timer, Ansible, e perfino quando conviene lasciar perdere Bash e passare a Python.
Se sei un sysadmin, uno sviluppatore o un imprenditore digitale che vuole far funzionare i server senza doverci pensare ogni giorno, qui trovi tutto quello che serve.
Come funziona lo shell scripting in Bash e perché è ancora fondamentale nel 2026
Bash è il collante di ogni sistema Linux. Non è un linguaggio di programmazione elegante, ma è il più diretto per orchestrare comandi di sistema. Se devi spostare file, leggere log, lanciare processi, Bash lo fa in una riga dove Python ne richiederebbe dieci.
Noi usiamo Bash per ogni automazione server: deploy, backup, monitoraggio, rotazione log. La regola è semplice: se lo fai più di una volta, scrivi uno script.
Sponsored Protocol
Variabili, condizioni, cicli e funzioni: le basi che devi conoscere
Uno script Bash non è diverso da un programma: ha variabili (NOME="Mario"), condizioni (if [ -f /etc/passwd ]), cicli (for file in *.log) e funzioni (function fail() { echo "Errore: $1"; exit 1; }).
L’errore più comune? Non mettere set -e all’inizio. Senza, lo script continua anche se un comando fallisce. Noi lo mettiamo sempre, insieme a set -u per rilevare variabili non definite.
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/db"
mkdir -p "$BACKUP_DIR"
mysqldump --all-databases > "$BACKUP_DIR/dump_$(date +%Y%m%d).sql"
echo "Backup completato con successo."
Questo script elementare è già pronto per un cron job. Non serve altro.
Quali comandi Linux servono davvero per automazione: grep, awk, sed, find, xargs
Uno script Bash senza comandi potenti è solo una lista di operazioni banali. Il vero salto lo fai con gli strumenti di elaborazione testo: grep per filtrare, sed per sostituire, awk per strutturare, find per cercare con criteri complessi, xargs per parallelizzare.
Come usare grep e sed per pulire file di log
Vediamo un caso concreto: un server web produce migliaia di righe di log al minuto. Vuoi estrarre solo gli errori 500, togliere i timestamp e salvare in un file compresso.
grep 'HTTP/1.1" 500' /var/log/nginx/access.log | sed 's/.*\] //' > /tmp/errors_500.txt
In una riga hai filtrato e formato. Noi abbiamo usato pattern simili per ridurre del 70% il tempo di analisi di un problema su un e-commerce con traffico alto.
Awk per estrarre dati strutturati da colonne
Se i dati sono in formato colonnare (es. /etc/passwd o log con campi separati), awk è imbattibile:
Sponsored Protocol
awk -F: '{ if ($3 >= 1000) print $1 " " $6 }' /etc/passwd
Questo stampa utenti reali (UID >=1000) con la loro home directory.
Come programmare cron job avanzati e quando preferire systemd timer
Servono backup notturni? Riavvio di servizi? Pulizia cache? Servono cron o systemd timer. Noi usiamo cron per task semplici e systemd timer quando serve controllo fine (dipendenze, logging, fallimento).
Esempio di cron job per backup database ogni giorno alle 2:30
30 2 * * * /usr/local/bin/backup_db.sh
Non dimenticare di reindirizzare stdout/stderr a un log: 30 2 * * * /script >> /var/log/backup.log 2>&1.
Systemd timer: quando cron non basta
Con systemd puoi definire unità timer che avviano un servizio. Vantaggi: logging integrato in journalctl, possibilità di eseguire solo se il sistema è attivo (after network.target) e gestione delle dipendenze.
Noi li usiamo per deploy automatizzati: il timer controlla un repository git ogni 5 minuti e se ci sono nuove commit, esegue pull + rebuild.
SSH avanzato: key management, tunneling e config file per automazione sicura
L'automazione senza SSH sicuro è come una serratura senza chiave. Ogni script che si connette a server remoti deve usare chiavi SSH con passphrase, meglio se protette da SSH agent. Noi consigliamo di creare una chiave dedicata per automazione senza password, ma limitata per IP e comandi con authorized_keys.
Config file SSH per saltare VPN e tunnel
Vogliamo connetterci a un server interno via bastion host? Scriviamo ~/.ssh/config:
Host interno
HostName 10.0.0.5
User deploy
ProxyJump bastion.example.com
Poi ssh interno funziona in trasparenza. Utile anche per tunnel di database: ssh -L 3307:db.internal:3306 bastion.
Sponsored Protocol
Come automatizzare backup, deploy e monitoraggio con Bash su server Linux
Tre scenari reali in cui Bash ci ha salvato tempo e denaro.
Backup incrementale con rsync e cron
Noi usiamo rsync per backup su NAS remoto:
rsync -avz --delete --exclude='.cache' /home/user/ backup@nas:/backups/
Il flag --delete garantisce che file cancellati localmente vengano rimossi anche sul backup.
Deploy automatico da git
Abbiamo uno script che ogni minuto controlla eventuali commit su un branch di produzione e se ci sono novità esegue pull, composer install e riavvia il servizio. Lo abbiamo implementato per clienti con traffico alto che vogliono zero downtime.
Monitoraggio di risorse (CPU, RAM, disco) con alert via Telegram
Con poche righe in cron:
#!/bin/bash
LIMIT=80
USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$LIMIT" ]; then
curl -s -X POST "https://api.telegram.org/botTOKEN/sendMessage" -d "chat_id=ID&text=Attenzione! Disco ${USAGE}% pieno."
fi
Qual è la differenza tra sed e awk e quando usare l'uno o l'altro?
Domanda classica. sed è un editor di flusso: perfetto per sostituzioni globali (s/vecchio/nuovo/g), cancellazioni, stampe condizionali. awk è un linguaggio per estrarre e manipolare dati colonnari con condizioni e cicli.
Regola pratica: se devi solo modificare testo (sostituire, eliminare righe), usa sed. Se devi elaborare testo (calcolare somme, filtrare per campi), usa awk. Noi li combiniamo spesso: awk pre-elabora, sed pulisce.
Sponsored Protocol
Gestione processi Linux: ps, kill, signal, nohup e background jobs per script robusti
Uno script che lancia processi in background deve saperli gestire. Con & e wait puoi parallelizzare. Con nohup eviti che il processo muoia alla disconnessione. Con kill -9 fermi anche i processi bloccati.
Noi usiamo trap per pulire risorse:
cleanup() {
echo "Interruzione... uccido processi"
kill $PID 2>/dev/null
}
trap cleanup EXIT INT TERM
Filesystem Linux: permessi, ownership, inode e link simbolici in automazione
Errori di permessi sono tra i più comuni in automazione. Ricorda: chmod 755 per eseguibili, chown deploy:deploy per ownership. I link simbolici sono utili per versioni di deploy: ln -sfn /var/www/releases/20260415 /var/www/current.
Scripting con Python come alternativa a Bash: quando e perché conviene
Bash è ottimo per orchestrazione di comandi, ma se serve logica complessa, parsing JSON/XML, espressioni regolari avanzate o librerie esterne, Python è superiore. Noi, di Meteora Web, abbiamo adottato Python per tutti i tool di automazione che devono interagire con API REST (es. backup su cloud, invio email, gestione certificati SSL).
Esempio: quando su un server si è rotto il rinnovo automatico dei certificati SSL, abbiamo scritto uno script Python che controlla la scadenza e chiama l'API di Let's Encrypt – in Bash sarebbe stato ingarbugliato.
import os, subprocess
from datetime import datetime, timedelta
domain = "esempio.com"
expiry = subprocess.getoutput(f"openssl s_client -connect {domain}:443 2>/dev/null | openssl x509 -noout -enddate")
if "30 days" in expiry:
subprocess.run(["certbot", "renew"])
Ansible per automazione: configurare server senza SSH manuale
Se hai più server da gestire, Ansible è il salto successivo. Si connette via SSH (senza agent) e applica configurazioni dichiarative in YAML. Noi lo usiamo per:
Sponsored Protocol
- Installare LAMP su nuovi server in 2 minuti
- Aggiornare tutti i pacchetti di sicurezza su 20 macchine con un comando
- Distribuire chiavi SSH e configurazioni firewall in modo consistente
Esempio di playbook per installare Nginx:
---
- name: Installa Nginx
hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start and enable
service:
name: nginx
state: started
enabled: yes
Ansible non sostituisce Bash: lo usa. Per task semplici, Bash va bene. Per orchestrazione multi-server, Ansible è la scelta giusta.
In sintesi: cosa fare adesso per iniziare con l'automazione Linux
- Identifica un compito ripetitivo che fai almeno una volta a settimana (backup, aggiornamento, pulizia log).
- Scrivi uno script Bash con
set -euo pipefaile testalo manualmente. - Programmalo con cron o systemd timer. Aggiungi logging e alert su Telegram o email.
- Quando lo script cresce (più di 100 righe o interazione con API), valuta di riscriverlo in Python.
- Se hai più di 3 server, impara Ansible: guarda la documentazione ufficiale.
Noi, di Meteora Web, viviamo di automazione. Dal piccolo script per il backup clienti fino alla piattaforma proprietaria di gestione social multiente. Il tempo speso in automazione non è mai tempo perso: è investito in libertà.