GNU/Linux >> Linux Esercitazione >  >> Linux

Il modo migliore per garantire che uno script venga eseguito una volta per ciclo?

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 .


Linux
  1. Eseguire un comando oscurato da un alias?

  2. Il modo migliore per rilevare (da uno script) se il software è installato?

  3. Modo per fare in modo che uno script di shell venga sempre eseguito come root?

  4. Eseguire script con argomenti come utente?

  5. Da dove viene eseguito uno script di shell?

Come eseguire uno script Python in PHP

Come eseguire uno script Bash

Script all'avvio?

Esegui lo script bash come demone

Il modo migliore per creare script di comandi SSH remoti in Batch (Windows)

Qual è il modo più veloce per eseguire uno script?