Crear Jobs usando un script en Shell

Automatiza la creación de Jobs en Linux

Intentando automatizar algunos procesos en unos servidores que uso para Rolteca me he encontrado con la necesidad de tener que crear un par de scripts que lancen unos procesos cada cierto tiempo.

Para sorpresa, la mayor parte de la información que encontré fue desfasada o bastante confusa, así que hoy vamos a ver cómo crear un script que generé jobs en Linux

¿Cómo se crea un job en Linux?

Bien, lo primero que tienes que saber es que para crear un juego necesitas tener acceso al comando

1crontab

este comando tiene dos parámetros interesantes

1crontab -l

Nos permitirá ver la lista de Jobs dados de alta para el usuario en el que estemos conectados en eses momento

1crontab -e

Este será el que tengamos que utilizar para añadir nuestro Job a la tabla. Por lo normal se suele abrir el documento con nano o vi, y lo podremos editar cómo un fichero de texto más.

La siguiente pregunta obvia es ¿Qué narices tengo que añadir en este fichero del demonio?

Pues bien, un cron en Linux esta formado por dos secciones

1* * * * * "Comando que ejecutar"
2- - - - -
3| | | | |
4| | | | -----   Día de la semana(0 - 7)
5| | | -------  Mes (1 - 12)
6| | --------- Día del mes (1 - 31)
7| -----------Horas (0 - 23)
8------------Minutos (0 - 59

Para la estructura de la fecha, te recomiendo que uses un generador como por ejemplo https://crontab.guru/ para que no te tengas que romper la cabeza.

Además recuerda que el comando para ejecutar debe ser o bien una ruta absoluta o un comando que esté dado de alta para el usuario que estés usando

¿Cómo se usan los operadores de un job?

Groso modo puedes trabajar con cinco opciones, que ocupar en cada uno de esos huecos

  1. Asteriscos (*): Esto se servirá para hacer referencia a cualquier valor. Por ejemplo * * * * * se ejecutaría cada minuto de cada hora, día del mes, mes y día de la semana
  2. La coma (,): Bastante intuitiva, te servirá para separar valores en una lista. Por ejemplo 1,7,8,9 * * * * se ejecutará los minutos 1,7,8,9 de cada hora de cada día
  3. El guion (-): Para definir rangos y no tener que sobreexplotar la coma Por ejemplo, * * 5-15 * * esto se ejecutará cada minuto de cada hora entre los días 5 y 15
  4. La barra lateral (/): Con esto vamos a crear patrones por ejemplo * */2 * * * Esto se ejecutará cada minuto de la hora cada dos horas, es decir todos los minutos de la hora actual, todos los minutos de dentro de dos horas etc...

Vamos a montar el script

Para que el script funcione correctamente debemos hacer 3 cosas, en primer lugar un backup de los jobs actuales. La única forma de añadir nuevos jobs de manera automatizada es reemplazando el fichero actual. Una vez tengamos el backup hecho vamos a añadir una nueva línea con nuestro job acto seguido cargamos el fichero modificado y borramos la copia temporal

1#!/bin/sh
2sudo crontab -l > cron bkp
3sudo echo "* * * * * sudo /home/test.sh >/dev/null 2>>1" >> cron bkp
4sudo crontab cron bkp
5sudo rm cron bkp