Programar la ejecución de un script en Linux

Para programar la ejecución de un script (o un comando) en linux, utilizaremos el comando crontab:

crontab [-u <USUARIO>] { <ARCHIVO> | -e | -l | -r }

  • -u <USUARIO>: Indica el USUARIO del archivo crontab que se va a utilizar
    • Si no se especifica, se utiliza el usuario logueado
  • <ARCHIVO>: indica el archivo que contiene las entradas, crea un nuevo crontab para el usuario y las programa.
  • -e: Edita el contenido del archivo crontab del usuario. Si no existiera, crea uno nuevo.
    • Al salir del editor, se programan las entradas.
  • -r: Quita el crontab actual
  • -l: Muestra el contenido del archivo crontab actual

 

Las entradas de los archivos crontab tienen el siguiente formato:

* * * * *  Script o comando a ejecutar
- – – – -
| | | | |
| | | | +— Día de la semana (0–6) o Sun, Mon, Tue,...
| | | +——— Mes (1–12) o Jan, Feb,...
| | +————— Día del Mes (1–31)
| +——————— Hora (0–23)
+————————— Minuto (0–59)

En los días de la semana, 0 se corresponde a domingo (Sun).

Para todos los campos, se puede especificar:

  • un asterisco * que indica “cualquiera de los valores”
    • se permite especificar un salto de N valores mediante  “*/<N>” (cada n minutos, horas, días, etc.)
      • Ejemplo: */6 en el campo de horas = lista “0,6,12,18”
  • una lista de valores numéricos o textos de 3 letras (para meses y días de la semana) separados por coma
    • Ejemplo: “6,8,9” o “Jan, Mar, Jul”
  • un rango numérico separando con guión medio (-) el menor valor y el mayor (incluídos en el rango) “<MIN>-<MAX>”
    • Ejemplo “1-4” = “1,2,3,4”
    • se permite especificar un salto de N valores mediante  “<MIN>-<MAX>/<N>” (cada n minutos, horas, días, etc.)
      • Ejemplo: “5-28/3” = lista “5,8,11,14,17,20,23,26”

El script se ejecuta cuando la hora, los minutos, el mes y, el día del mes o de la semana, coinciden con el momento actual.

La aplicación residente cron (se ejecuta en background) consulta los archivos crontab para saber qué ejecutar y cuándo hacerlo.

Por defecto, envía la salida del comando al usuario definido en la variable de entorno MAILTO. Para ver si está definida, podemos imprimirla por línea de comandos:

echo $MAILTO

Para evitarlo, debemos redirigir la salida de STDOUT y STDERR

Ejemplos:

#Ejecutar backup.pl de lunes a viernes a la 1 de la mañana y generar un log

0 1 * * 1-5 ./backup.pl > /var/logs/backup.log 2>&1

#Ejecutar check_filesystem.pl a las 12 del mediodía cada 3 días y también los sábados

0 12 */3 * 6 ./check_filesystem.pl > /dev/null 2>&1

#Ejecutar sync.pl a las 8:30, 11:30, 15:30, 17:30 todos los días entre Marzo y Noviembre, generando el log correspondiente

30 8,11,15,17 * 3-11 * ./sync.pl > /var/log/sync.log 2>&1

#Ejecutar reports.pl a las 8:50 los días 15 y 28 de cada mes

50 8 15,28 * * ./reports.pl > /dev/null 2>&1

#Ejecutar get_mails.pl cada 20 minutos entre las 9 y las 18

*/20 9-18 * * * ./get_mails.pl > /dev/null 2>&1

 

Basado en:

http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5

http://ss64.com/bash/crontab.html

Tagged with: , , ,
Publicado en Linux