PyWombat

← Volver a artículos

¿Cómo ejecutar de forma automática tus scripts en

May 31, 2020

11246 views

4 min de lectura

El tema de automatización es sin duda uno de mis temas favoritos en cuanto a programación se refiere. Buscar formas de reducir costos, tiempo, mano de obra y errores, con el fin de obtener resultados cada vez mejores, es sin duda el target de muchos desarrolladores, y a lo que todas las empresas aspiran para cada uno de sus procesos. 🤖

Sin duda todos queremos hacer más con menos recursos, sin embargo hay ocasiones en las cuales no nos percatamos y nos encontramos trabajando en tareas que fácilmente pueden automatizarse. Todas aquellas actividades que involucren una cierta cantidad de tiempo y sean repetitivas, en la gran mayoría de los casos son candidatas a una automatización.

Automatizar tareas no solo implica realizar menos, en menos tiempo y con los mismos, o mejores resultados. También podemos hablar de automatización cuando delegamos nuestra participación en una actividad, dejando que un tercero la realice por nosotros.

En programación existen diferentes formas de automatizar procesos, es por ello que, en esta ocasión, me gustaría mostrarte una de ellas, el cómo poder ejecutar nuestros scripts de Python de forma periódica y automática. ⏰

Para este post estaré trabajando con el sistema operativos Mac OS, sin embargo el tutorial funciona para cualquier sistema basados en unix (Ubuntu, Fedora, Red Hat etc ... ) Inclusive en Windows, claro, siempre y cuando poseas el bash de Ubuntu.

Bien, una vez dicha la introducción, comencemos.

Ejecución periódica.

Imaginemos el siguiente escenario.

Nos encontramos desarrollando un programa en Python el cual nos permite conocer el precio actual del dólar. No interesa que esta información sea enviada a todos nuestros usuarios vía correo electrónico. El correo deberá enviarse todos los días a las 9 de la mañana. 👾

En primera instancia la tarea no suena algo complicada. Basta con consumir un API, crear un correo y por supuesto enviarlo a todos los usuarios. El hecho de ejecutar un script no debiese tomarnos más de par de segundos

python main.py

Sin embargo si todos los días, a las 9 am, debemos ingresar al servidor y ejecutar de forma manual el script, quizás no sea nuestra mejor idea. Ya que, ¿Qué pasa si por alguna razón un día no tenemos acceso a internet, nuestra computadora falla o simplemente nuestra alarma no sonó y nos quedamos dormidos?

Que un usuario se encuentre involucrado en la ejecución manual de algún proceso, abre la posibilidad a un gran cantidad de errores, recordemos, no somos perfectos y nos podemos equivocar. En este caso lo mejor que podemos haces es automatizar, de forma periódica, la ejecución del script. Y para ello nos podemos apoyar de Cron.

CRON

Si nunca habías escuchado hablar de Cron no te preocupes, aquí te lo explicamos. Verás, Cron no es más que un demonio (un proceso que se ejecuta en segundo plano) que nos permitirá programar la ejecución de comandos mediante una fecha establecida.

Para comandos que necesitan ser ejecutados periódicamente, por ejemplo: cada mes, cada semana, cada hora, cada minuto etc.. sin duda Cron será nuestra mejor opción.

Siguiendo con nuestro ejemplo anterior, enviar el correo todos los días (partiendo que ya tenemos nuestro programa Python funcionando) lo primero que debemos hacer será crear un archivo .sh. Dentro de este archivo colocaremos los comandos necesarios para poder ejecutar el programa.

#!/bin/bash

cd /Users/eduardo/Documents/curso
source env/bin/activate

python main.py

En este caso lo primero que hacemos es movernos al directorio donde se encuentra el proyecto, posteriormente activamos el entorno de desarrollo y finalmente ejecutamos el script. Bastante sencillo cómo podemos observar.

Una vez el archivo .sh hay sido creado, el siguiente paso será probarlo. Para ello debemos cambiar sus permisos.

chmod +x <filename>.sh

Ejecutamos

./<filename>.sh

Y si nuestro programa Python se ejecutó de forma exitosa, daremos por hecho que el archivo .sh funciona perfectamente, con lo cual ya podremos programar se ejecución periódica. Para ello será necesario crear un nuevo archivo crontab. Dentro de este archivo colocaremos todas las introducción que el demonio Cron ejecutará.

Dependiendo del sistema operativo este archivo debe encontrarse almacenado en diferentes directorios. Para no complicarnos nos apoyaremos el programa crontab.

crontab -e  

Con la bandera -e crearemos y/o editaremos el archivo crontab.

Si queremos editar el archivo con el editor de texto nano, ya que por default será Vim, el siguiente comando te será de mucha utilidad. 😉

env EDITOR=nano crontab -e

Dentro del archivo colocaremos la fecha exacta de ejecución junto con el comando a ejecutar.

La estructura de crontab será la siguiente:

5 caracteres, separados por un espacio, los cuales hacen referencia a un periodo de tiempo.

* * * * * comando a ejecutar.
- - - - -
| | | | |
| | | | ----- Día de la semana (0 - 7) (Domingo=0 or 7)
| | | ------- Mes del año (1 - 12)
| | --------- Día del mes (1 - 31)
| ----------- Hora del día (0 - 23)
------------- Minuto del día (0 - 59)

Aquí un par de ejemplos para que nos quede mucho más en claro.

# Ejecutar script todos los día primero de cada mes a las 9:15 pm.
15 21 1 * * /path/to/script.sh
# Ejecutar script cada 5 minutos, después de las 5pm los días domingos
5 17 * * sun /path/to/script.sh

Para nuestro ejemplo la sentencia debería quedar de la siguiente manera.

0 9 * * * /path/to/<filename>.sh

Ejecutamos nuestro script todos los días a las 9am. No olvidemos colocar la ruta exacta de nuestro archivo .sh.

Guardamos y listo. Ya habremos dejado programada nuestra tarea, ahora solo falta esperar la hora exacta. 🎉

👉🏼 Nota: Siempre que trabajemos con Crontab será necesario verificar nuestra zona horaria, ya que a veces los servidores remotos no poseen el mismo horario que nuestra computadora local.

Para nosotros poder listar todos los comandos previamente programados, ejecutaremos la siguiente sentencia.

crontab -l

Si en dado caso queremos eliminar el archivo.

crontab -r

Sudo

Y ahora ¿Qué pasa si nuestros script debe ejecutarse como super usuario? Pues bien, en esos casos sólo debemos trabajar con el archivo crontab como super usuario.

sudo crontab -e
sudo crontab -l
sudo crontab -e

Cadenas reservadas

Es importante mencionar que en unix existente ciertas cadenas de texto que hacen referencia a determinados periodos de tiempo. Por supuesto estas cadenas podemos utilizarlas en nuestro archivo crontab.

  • @reboot: Una vez inicie el equipo.
  • @yearly: El primer minuto del año. Equivalente: 0 0 1 1 *
  • @monthly: El primer día de cada mes. Equivalente : 0 0 1 * *
  • @weekly: El primer minuto de la semana. Equivalente : 0 0 * * 0
  • @daily: El primer minuto de todos los días: Equivalente 0 0 * * *
  • @hourly: El primer minuto de cada hora. Equivalente : 0 * * * *

Conclusión

Listo, de esta forma tan sencilla, delegando al ejecución de nuestro script, seremos capaces de automatizar procesos. Sin duda Cron junto con crontab nos serán de mucha ayuda.

Lo interesante de todos esto, creo yo, es la gran flexibilidad con la cual podemos establecer fechas muy puntuales. Podemos utilizar meses, días de la semana, horas e inclusive minutos, pudiendo así sacarle el máximo provecho posible 🍻

Programar el respaldo automático de una base de datos, calcular balances, envío de correos y cualquier tarea repetitiva fácilmente pueden ser programadas.