Automatizar la ejecución de scripts

Objetivo

El objetivo de este proyecto es conseguir automatizar la ejecución de un script de forma periódica. Para ello utilizaremos la función de crontab de Linux.

Desarrollo

Consideraciones previas:

  • Se automatizará la ejecución de scripts en un servidor Ubuntu 20.04 aunque debería ser similar en cualquier distribución de Linux.
  • Si se desa automatizar tareas en Windows o Mac, os recomiendo este artículo de Ander Fernández.
  • Para la realización de este proyecto se ha seguido el siguiente tutorial de Digitalocean.

Alguien podría pensar que la forma para ejecutar un comando cada 24 horas podría ser una especia de código tal que el siguiente…

import time

while true:
    time.sleep(86400)
    ...

Utilizar esta fórmula sería…. digámoslo, la peor de las maneras de realizar dicha tarea. Para realizar las atreas de automatización existe en Linux los trabajos Cron y el fichero Crontab. A continuación explicamos cómo utilizar dicha funcionalidad.

Cron es un administrador de tareas de Linux que permite ejecutar comandos en un momento determinado, por ejemplo, cada minuto, día, semana o mes. Por lo tanto, el primer paso será instalar Cron. Puede que ya lo tengas instalado, pero por si acaso conviene asegurarse. Para ello, ejecutaremos los siguientes comandos.

sudo apt install cron
sudo systemctl enable cron

Las tareas de Cron se registran y administran en un archivo especial llamado crontab. Cada perfil de usuario del sistema puede tener su propio crontab para programar tareas, que se almacenan en /var/spool/cron/crontabs.

Para programar una tarea, simplemente hay que abrir su crontab para así editar y añadir una tarea escrita en forma de expresión de Cron.

La sintaxis de un comando cron es la siguiente:

También puede incluir ciertos caracteres especiales en el componente de programación de una expresión de Cron para facilitar la programación:

  • *: en las expresiones de Cron, el asterisco es la variable comodín que representa “todo”. Por lo tanto, una tarea programada con * * * * * … se ejecutará cada minuto de cada hora de cada día de cada mes.
  • ,: las comas separan los valores de programación para crear una lista. Si desea que una tarea se ejecute al comienzo y a la mitad de cada hora, en lugar de escribir dos tareas separadas (por ejemplo, 0 * * * * … y 30 * * * * …​), podría lograr la misma funcionalidad con una sola (0,30 * * * * …).
  • -: el guión representa una variedad de valores en el campo de programación. En lugar de tener 30 tareas programadas por separado para un comando que desee ejecutar durante los primeros 30 minutos de cada hora (como en el caso de 0 * * * * …, 1 * * * * … y 2 * * * * …, entre otros), podría programarlo con el valor 0-29 * * * * ….
  • /: puede usar una barra diagonal con un asterisco para expresar un valor de paso. Por ejemplo, en lugar de escribir ocho tareas de Cron separadas para ejecutar un comando cada tres horas (como en el caso de 0 0 * * * …, 0 3 * * * … y 0 6 * * * …, entre otros), podría programarlo con el siguiente valor: 0 */3 * * * ….

Puedes conocer más sobre la sintaxis de Cron en esta web o utilizar la herramienta Crontab guru.

Para editar el fichero Crontab deberemos ejecutar el siguiente comando. Si es la primera vez que lo ejecutamos, el sistema nos solicitará que le indiquemos el editor a utilizar. En nuestro caso elegiremos Nano.

crontab -e

Este comando permitirá la edición del fichero crontab a través del editor seleccionado, en nuestro caso Nano. El comando anterior nos debería mostrar una pantalla tal que la siguiente imagen:

Por último únicamente quedaría escribir el comando y guardar el fichero y salir del editor. Para guardar el fichero y salir hay que pulsar Ctrl + X y después decirle que guarde los cambios Y.

Como se puede apreciar en la siguiente imagen, este es el comando a ejecutar.

* * * * * cd /home/jupyter-datalab/ && python3 prueba.py >> output_logs.op

La primera parte del comando (* * * * *), le dice a Crontab la frecuencia de automatización. En este caso, el comando se ejecutará cada minuto.

La segunda parte del comando (cd /home/jupyter-datalab/ &&) define cuál es la ruta (el path) donde está ubicado nuestro script. En este caso en la carpeta /home/jupyter-datalab/

La tercera parte es la propia ejecución del script (python3 prueba.py). a veces será necesario definir también la ruta en la que está instalado Python (para saber la ruta escribir el comando which python3) pero en nuestro caso es suficiente con poner python3 y después el nombre del script de python.

La última parte (>> output_logs.op) hace referencia a dónde queremos que se almacenen los logs de ejecución del comando. Sobre todo para conocer los posibles errores de ejecución.

Y por último, si deseamos únicamente leer el fichero crontab, podemos ejecutar el siguiente comando.

crontab -l

Y con esto, el servidor debería ejecutar el comando sin problemas.

Bonus track: Cambiar la zona horaria del servidor

Un tema a tener en cuenta es la configuración de la zona horaria del servidor Linux. Para ver la zona horaria configurada hay que ejecutar el siguiente comando:

timedatectl

Para saber las posibles zonas horarias a definir, puedes ejecutar el siguiente comando:

timedatectl list-timezones

En nuestro caso, hemos definido la zona horaria a Europe/Madrid. Para ello hemos ejecutado el siguiente comando:

sudo timedatectl set-timezone Europe/Madrid

Resultados

El resultado de este proyecto es tener configurado un cron que ejecute un script de python de forma automática.

top