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»
- se permite especificar un salto de N valores mediante «*/<N>» (cada n minutos, horas, días, etc.)
- 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: