Ho bisogno di un certo script da eseguire una volta al mese (altri che visualizzano questa domanda potrebbero aver bisogno che venga eseguito una volta al giorno/settimana/anno/5 giorni, ecc.).
So che posso usare cron per farlo con:
0 0 1 * * ./script.sh
Ma cosa succede se la macchina è offline durante quell'intervallo (spegnimento il 1° di un mese particolare, ad esempio).
Esiste un elegante soluzione a questo? Oppure dovrei includere una sub-routine in quello script per impostare un I've-run-this-month-already
value, quindi un altro script viene eseguito ogni giorno del mese (o all'avvio) per verificare quel valore?
Aggiornamento:
Ho bisogno che il mio script venga eseguito una volta al mese all'inizio del mese. Durante la scrittura di uno script per realizzare una serie di cose, ho creato la parte di codice seguente. Lo metto qui solo nel caso qualcuno lo trovi utile dopo aver trovato questa domanda.
# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
# CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi
# CREATE A NEW FILE EVERY TIME THIS SCRIPT IS RUN WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/this_month
# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
# RUN YOUR RELEVANT CODE HERE #
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
fi
Risposta accettata:
È possibile utilizzare Anacron per questo, è progettato per eseguire lavori a determinati intervalli senza presumere che il sistema sia continuamente acceso. Se un lavoro dovrebbe essere eseguito ogni mese, Anacron verificherà se è stato eseguito nel mese precedente e lo eseguirà in caso contrario (e ricorda che non è necessario eseguirlo di nuovo per un altro mese).
Nei derivati Debian, Anacron funziona bene con Cron per prendersi cura di /etc/cron.{daily,weekly,monthly}
in modo appropriato (quindi definisci semplicemente la tua attività mensile come un lavoro mensile in /etc/cron.monthly
, e verrà eseguito in modo appropriato).
Su altri sistemi, definiresti la tua attività mensile in /etc/anacrontab
.