Ejecutar script automáticamente con Cron en Linux

- Andrés Cruz

In english
Ejecutar script automáticamente con Cron en Linux

Los Cron son administradores de procesos que se ejecutan en segundo plano cada cierto tiempo según sean configuremos; son ampliamente utilizados para hacer backup programados; como usuarios podemos automatizar tareas con comandos BASH (por ejemplo para ejecutar un script como un .sh); de esta forma podemos tener una administración completa de un sistema; no sólo es posible emplear .sh para utilizar un Cron, también se puede emplear cualquier tipo de comando BASH (por ejemplo para ejecutar un archivo PHP); todo depende de lo que se desee hacer.

Diferencias entre Cron y Crontab

Aunque pareciera que estamos indicando sinónimos cuando nos referimos al uno o al otro, estos son dos elementos independientes, en donde el Cron es un proceso y el otro es un archivo de texto que nosotros personalizamos con las reglas que explicaremos más adelante.

El Cron es un demonio (servicio)

El Cron es un demonio o también conocido como servicio, y por lo tanto solo es iniciado una vez, generalmente con el mismo arranque del sistema y al iniciar y cada cierto tiempo revisa si tiene algo que hacer, una tarea conocida como job que es lo que nosotros configuramos y la compara con la fecha del sistema para ver si existen coincidencias entre la hora programada en el crontab con la hora del sistema.

Crontab es un archivo en nuestro Linux

Cron es el administrador de procesos, Cron lee en un archivo de texto plano llamado Crontab en donde se guardan una lista de comandos creados por el usuario ha ser ejecutados; la sintaxis para crear una de estas tareas programadas en muy sencilla:

* * * * * comando ha ser ejecutado - - - - - | | | | | | | | | ----- Día de la semana (0 - 7) | | | ------- Mes (1 - 12) | | --------- Día del mes (1 - 31) | ----------- Hora (0 - 23) ------------- Minuto (0 - 59)

Formato básico de una tarea en el Crontab: Agregar tareas al Crontab

Básicamente consta de dos mitades:

  • El tiempo en el cual se ejecutará la tarea del Crontab; el mismo está compuesto por operadores y resulta de lo más versátil:
    • Cada minuto: En intervalos de entre 0 a 59.
    • Cada hora: En intervalos de entre 0 a 23.
    • Cada día: En intervalos de entre 0 a 31.
    • Cada mes: En intervalos de entre 0 a 12 (0==12 y 12 == Diciembre).
    • Cada día de la semana: En intervalos de entre 0 a 7 (0==7 y 7 == domingo).
  • El comando BASH:

Como puedes ver son bloques de duración que van desde minutos a días de semana y mes; si se deja un asterisco, esto quiere decir que el Cron se ejecuta cada minuto, hora, día del mes:

* * * * * /path/para/script.sh

Ejecuta el script.sh cada minuto, de cada hora, de cada día del mes, de cada semana; en otras palabras, el Cron ejecuta el script cada minuto de los 365 días del año.

Para ejecutar un .sh cada cierto tiempo podemos hacer algo como lo siguiente:

1 2 3 4 5 /path/para/script.sh

Si el .sh recibe parámetros:

1 2 3 4 5 /path/para/script.sh p1 p2 ... pn

En donde p1, p2, ... pn son los parámetros que recibe el .sh.

Uso de los operadores en una tarea para el Crontab

Con los operadores es posible especificar varios valores en un campo; existen tres posibles valores:

  • El asterisco (*): Este operador abarca todos los valores posibles; un asterisco en un campo minutos es igual a ejecutar el script cada minuto.
  • la coma (,): Este operador permite especificar una lista de valores; por ejemplo si queremos ejecutar un comando los lunes y miércoles: "1,3" en el campo de los días.
  • El guión (-): Este operador especifica una serie de valores de manera agrupada con un cota inferior y una superior; por ejemplo si quisiéramos ejecutar un comando de lunes a viernes podríamos colocar el siguiente valor en el campo día: "1-5", que es equivalente a 1,2,3,4,5.

Agregar una tarea para su ejecución

Ya vimos como es el formato básico de un Cron, ahora lo interesante resulta en ¿Cómo agregamos un Cron o nuestra tarea para su ejecución?

1

Abrimos nuestro consola o terminal:

consola de linux

2

Ejecutamos el siguiente comando:

Crontab -e 

consola de linux editando crontab con vi

a través de un editor de consola; VI, VIM, nano o cualquier otro que se tengan instalado, agregamos la tarea al Crontab; por ejemplo:

0 22 * * 1-5 /home/fedora/sh/backup.sh

Si deseas ver la lista de tareas en el Crontab en el sistema:

Crontab -l

Ejemplos de tareas en el Crontab: Intervalos de tiempo

Si deseamos ejecutar una tarea del Crontab cada 5 minutos:

*/5 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 10 minutos:

*/10 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 20 minutos:

*/20 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 30 minutos:

*/30 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 40 minutos:

*/40 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 50 minutos:

*/50 * * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab cada 60 minutos:

*/60 * * * * /home/fedora/sh/backup.sh

Creo que quedó clara la idea; simplemente debes de variar la cantidad de minutos en la primera posición para que nuestro Cron haga el resto por nosotros.

Si deseamos ejecutar una tarea del Crontab a las 10 de la mañana:

0 10 * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los días:

15 14 * * * /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los días exceptuando los fines de semana (de lunes a viernes):

15 14 * * 1-5 /home/fedora/sh/backup.sh

Si deseamos ejecutar una tarea del Crontab a las 2:15 de la tarde todos los domingos:

15 14 * * 0 /home/fedora/sh/backup.sh

o

15 14 * * 7 /home/fedora/sh/backup.sh

o

15 14 * * sun /home/fedora/sh/backup.sh

Si deseamos ejecutar el 21 de octubre a las 7:21:

21 7 21 10 * /home/fedora/sh/backup.sh

Si deseamos hacer un backup todos los días a las ocho de la noche y guardar un registro (log) con los posibles errores al ejecutar el Crontab:

0 20 * * * /home/fedora/sh/backup.sh >>  /home/fedora/sh_backup/cron_ruas.log 2>&1

¿Cómo ejecutar PHP periódicamente con Cron en un servidor Linux?

Para ejecutar un php cada cierto tiempo podemos utilizar el siguiente comando:

php /var/www/html/prueba/test.php

Resulta interesante esta posibilidad; recordando un poco un artículo pasado:

¿Cómo conectarnos a Twitter y enviar tweets con PHP? vimos como conectar una aplicación escrita en PHP con la API de Twitter y de esta forma poder realizar muchas tareas u operaciones; basicamente enviamos un tweet; ahora podriamos automatizar la ejecucion de este script PHP para enviar los tweets:

*/5 * * * * php /var/www/html/twitter/sendtweets.php

Para enviar tweets cada cinco minutos.

Consideraciones

Recuerda cambiar los permisos del archivo para que pueda ser ejecutado por el administrador de Cron:

chmod a+x /home/fedora/sh/backup.sh

Puede que sea necesario reiniciar el servicio Cron luego de agregar una tarea:

service crond restart

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.