Cron e Bash
Pianificazione, debug dei job silenziosi e gli attrezzi Bash di ogni giorno. Ogni comando è verificato e copiabile; in chat basta descrivere cosa vuoi fare.
8 comandi in questa pagina
- Come vedo e modifico i cron job?
- Come eseguo uno script a ogni avvio?
- Come salvo l'output di un cron job in un log?
- Il cron job non parte (o fallisce in silenzio): come lo debuggo?
- Come inizio uno script Bash fatto bene (strict mode)?
- Come debuggo uno script Bash riga per riga?
- Lo script dà errori strani con ^M: che succede?
- Come imposto una variabile d'ambiente (temporanea o per sempre)?
# Come vedo e modifico i cron job?
crontab -l # elenca i tuoi
crontab -e # modifica
crontab -l -u mario # di un altro utente (da root)
I job di sistema stanno anche in /etc/cron.d/ e /etc/cron.{daily,weekly}: crontab -l non li mostra.
Approfondisci: Cron: la sintassi spiegata (finalmente)
# Come eseguo uno script a ogni avvio?
@reboot sleep 30 && /opt/script/avvio.sh
Lo sleep dà tempo alla rete di salire; per dipendenze serie (db pronto, mount presenti) meglio una unit systemd con After=.
Approfondisci: Cron: la sintassi spiegata (finalmente)Come si gestiscono i servizi Linux con systemctl?
# Come salvo l'output di un cron job in un log?
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
Senza redirect l'output svanisce (o prova a spedirsi via mail): un job senza log è un job di cui non sai nulla.
Approfondisci: Cron: la sintassi spiegata (finalmente)Dove sono i log su Linux (journalctl e /var/log)?
# Il cron job non parte (o fallisce in silenzio): come lo debuggo?
grep CRON /var/log/syslog | tail # e' partito?
# nel dubbio, riproduci l'ambiente di cron:
env -i /bin/sh -c '/opt/backup.sh'
"A mano va, in cron no" = quasi sempre PATH o variabili: cron ha un ambiente minimo, usa percorsi assoluti.
Approfondisci: Cron: la sintassi spiegata (finalmente)Bash scripting: le basi che servono (e le trappole)
# Come inizio uno script Bash fatto bene (strict mode)?
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
Esce al primo errore, sulle variabili non definite e sui fallimenti in pipe: i bug urlano subito invece di corrompere in silenzio.
Approfondisci: Bash scripting: le basi che servono (e le trappole)
# Come debuggo uno script Bash riga per riga?
bash -x script.sh
# o solo un tratto: set -x ... set +x
-x stampa ogni comando ESPANSO (variabili incluse): il 90% dei bug si vede lì. Il resto lo trova shellcheck.
Approfondisci: Bash scripting: le basi che servono (e le trappole)
# Lo script dà errori strani con ^M: che succede?
dos2unix script.sh
# senza dos2unix: sed -i 's/\r$//' script.sh
Fine riga Windows (CRLF): il classico bad interpreter: /bin/bash^M dopo un copia-incolla o un editor Windows.
Approfondisci: Bash scripting: le basi che servono (e le trappole)
# Come imposto una variabile d'ambiente (temporanea o per sempre)?
export API_URL=https://api.esempio.com # solo questa sessione
echo 'export API_URL=...' >> ~/.bashrc # per il tuo utente
# di sistema: /etc/environment
Per i servizi systemd niente bashrc: si usa Environment= o EnvironmentFile= nella unit.
Approfondisci: Bash scripting: le basi che servono (e le trappole)Come si gestiscono i servizi Linux con systemctl?