GNU/Linux >> Tutoriales Linux >  >> Linux

¿La mejor manera de garantizar que un script se ejecute una vez por período?

Necesito que un determinado script se ejecute una vez al mes (otros que vean esta pregunta pueden necesitar que se ejecute una vez al día/semana/año/5 días, etc.).

Sé que puedo usar cron para hacerlo con:

0 0 1 * * ./script.sh

Pero, ¿qué sucede si la máquina está fuera de línea durante ese intervalo (por ejemplo, se apaga el día 1 de un mes en particular).

¿Hay un elegante solución a esto? ¿O tendría que incluir una subrutina en esa secuencia de comandos para establecer un I've-run-this-month-already valor, y luego otro script se ejecuta todos los días del mes (o en el arranque) para verificar ese valor?

Actualización:

Necesito que mi script se ejecute una vez al mes a principios de mes. Mientras escribía un script para lograr una serie de cosas, creé el siguiente código. Solo lo pongo aquí en caso de que alguien lo encuentre útil después de encontrar esta pregunta.

# 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

Respuesta aceptada:

Puede usar Anacron para esto, está diseñado para ejecutar trabajos en ciertos intervalos sin asumir que el sistema está encendido continuamente. Si se supone que un trabajo debe ejecutarse todos los meses, Anacron verificará si se ejecutó en el mes anterior y lo ejecutará si no es así (y recuerde que no necesita ejecutarlo nuevamente por otro mes).

En los derivados de Debian, Anacron funciona muy bien con Cron para encargarse de /etc/cron.{daily,weekly,monthly} apropiadamente (de modo que simplemente defina su tarea mensual como un trabajo mensual en /etc/cron.monthly y se ejecutará correctamente).

En otros sistemas, definiría su tarea mensual en /etc/anacrontab .


Linux
  1. ¿Ejecutar un comando que está sombreado por un alias?

  2. Compilar un script PHP en Linux

  3. Ejecute el script bash después de iniciar sesión

  4. Ejecute un script de shell como un usuario diferente

  5. ¿Cuál es la mejor manera de verificar si un volumen está montado en un script Bash?

Cómo ejecutar un script de Python en PHP

Cómo ejecutar un script Bash

¿Ejecutar script con argumentos como usuario?

¿Desde dónde se ejecuta un script de Shell?

¿Script al inicio?

¿Cuál es la forma más rápida de ejecutar un script?