Cron jobs son el método estándar para ejecutar tareas programadas en su servidor. Cron es un servicio que corre en segundo plano el cual ejecuta tareas (jobs) en un tiempo especifico, o en intervalos regulares. Las tareas y su tiempo de ejecución se definen en un archivo llamado crontab.

Si tiene cPanel, los trabajos cron se pueden administrar directamente en su panel de control sin modificar directamente un crontab. puede revisar Cron Jobs en cPanel [Como configurarlos] para mas información.

Configuración

Las tareas Cron se almacenan en un archivo crontab por usuario. Este archivo se alamacena en  /var/spool/cron/crontabs/var/spool/cron/. Este archivos NO se debe editar directamente. El comando crontab siempre se debe utilizar para realizar cambios.

Puede editar su crontab con el siguiente comando:

$ crontab -e

Este comando abre el crontab en un editor de texto donde realizara los cambios necesarios. Guarde los cambios y cierre el archivo esto instalara el nuevo crontab.

El siguiente comando le permite visualizar los cambios realizados a su crontab:

$ crontab -l

El siguiente comando remueve totalmente su crontab:

$ crontab -r

Todos los comandos anteriores afectan solo al crontab del usuario con el que inició sesión. Es decir, si ha iniciado sesión como myuser, solo afectaría al crontab de myuser. Si ha iniciado sesión como usuario privilegiado (como root), puede afectar a otros usuarios utilizando la opción -u . Por ejemplo, el siguiente comando editaría el crontab para myuser:


$ crontab -u myuser -e

La opción -u se puede proporcionar con cualquiera de las otras opciones utilizadas anteriormente.

Syntax

Un archivo crontab le dice al Cron daemon qué comandos ejecutar y cuándo ejecutarlos. Tiene tres tipos diferentes de líneas: comando cron (cron command), configuracion del entorno (environment setting), y comentario (comment). Se ignoran las líneas en blanco, los espacios iniciales y las tabulaciones.

Comentarios

Cualquier línea cuyo primer carácter que no sea un espacio en blanco, sea un signo de almohadilla (#) se considerará un comentario. No se permiten comentarios en línea. Los comentarios no son procesados ​​por el Cron daemon.

Configuración del Entorno

La configuración del entorno esta en forma de:

name = value

Los espacios en blanco alrededor del signo igual (=) son opcionales y todo lo que se encuentra a la derecha del signo igual se considera parte del valor. El valor se puede citar (con comillas simples o dobles) para conservar los espacios iniciales o finales. A muchas variables de entorno se les asigna un valor predeterminado:

  • SHELL se establece en /bin/sh.
  • HOMELOGNAME se establece en /etc/passwd.

SHELLHOME puede ser anulado por la configuración del entorno, pero no puede con LOGNAME.

La variable MAILTO se comprueba para ver si es necesario enviar el correo. de forma predeterminada, el correo se envía al propietario del crontab. El correo se puede enviar a otra dirección de correo electrónico asignándolo a MAILTO. Si no desea que Cron envíe correo, signe MAILTO. Si no desea que Cron envíe correo, asigne MAILTO a la cadena vacía (MAILTO=""). La variable MAILTO solo afectará a dónde se envían los correos electrónicos para los comandos que vienen después de la línea asignada. Si desea cambiar todas las direcciones de correo electrónico de todos los comandos, deberá asignar MAILTO en la parte superior del archivo. Si desea cambiar la dirección de correo electrónico para un solo comando, configuraría MAILTO directamente sobre el comando y luego restablecería MAILTO a su valor anterior antes del siguiente comando.

Cron Commands

Un comando cron tiene seis campos: cinco campos de fecha y hora, y un campo de comando. El Cron daemon verifica la programación de cada trabajo cada minuto. Un trabajo se ejecuta siempre que la hora y la fecha coincidan con la hora y la fecha actuales.

Un comando cron completo se verá así:

0 0 * * * /path/to/command

Scheduling

Los cinco campos de fecha y hora son minutoshorasdia del mesmes, y dia de la semana respectivamente:

┌───────────── minute
│ ┌───────────── hour
│ │ ┌───────────── day of the month
│ │ │ ┌───────────── month
│ │ │ │ ┌───────────── day of the week
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *

Diagrama de arriba cortesía de Wikipedia.

FilaValores aceptados
minuto0-59
hora0-23
día del mes1-31
mes1-12 or names (see below)
día de la semana0-7 (Sunday is 0 or 7) or names

Los Cron jobs se ejecutan siempre que los campos de minuto  hora , y  mes coincidan con la hora actual, y cuando al menos uno de los campos de día del mes, o  día del año  los nombres de los dias de la semana o los meses son los primeros tres letras de un dia o mes (por ejemplo, Mon para lunes, Oct para Octubre).

Los cron programados para ejecutarse en momentos que se pueden "omitir" pueden provocar que los trabajos no se ejecuten cuando se espera que lo hagan. Un cron programado para ejecutarse el 31 de cada mes solo se ejecutará durante enero, marzo, mayo, julio, agosto, octubre y noviembre. Si se produce un cambio de horario de verano, un trabajo cron programado para ejecutarse a una hora que se omite, o se produce dos veces, se omitirá o se ejecutará dos veces, respectivamente.

Todos los campos pueden contener un asterisco (*) que representa cualquier valor.

Los rangos están permitidos y se escriben como dos números separados por un guión (-). Los rangos son inclusivos.

Las listas están permitidas y son números o rangos separados por comas, p. 1,3,5,7 o 0-7,16-23.

Los valores de paso se pueden usar con rangos. Un valor de paso se escribe como un rango seguido de una barra inclinada (/) y un número. El número le dirá al demonio Cron cuántas veces debe omitir ese trabajo antes de volver a ejecutarlo. El valor 0-23/2 en el campo de la hora le dice a Cron que ejecute el comando cada dos horas. Los valores de paso también se pueden usar con asteriscos, por lo que */2 también le indicará a Cron que ejecute un comando cada dos horas.


Comandos

El último campo de un comando cron es el comando que se ejecutará. Específicamente, todo lo que esté después del campo dia de la semana hasta una nueva línea o un carácter '%' se considera parte del comando, y será ejecutado por el shell establecido en la variable de entorno SHELL (/bin/sh por defecto).

Todos los caracteres '%' en un comando se convierten en caracteres de nueva línea. Un '%' literal debe ir acompañado de una barra invertida (\), por ejemplo \%. No es necesario escapar de otros caracteres en un comando.

Extensiones

Hay varias abreviaturas de tiempo especiales que se pueden usar en lugar de los cinco campos de fecha y hora.

ShorthandValue
@rebootEjecutar después de reinicio
@yearly or @annuallyEjecutar una vez al año (0 0 1 1 *).
@monthlyEjecutar una vez al mes (0 0 1 * *).
@weeklyEjecutar una vez a la semana (0 0 * * 0).
@dailyEjecutar una vez al dia (0 0 * * *).
@hourlyEjecutar cada hora (0 * * * *).

Ejemplos

Un comando que se ejecuta cada minuto:

* * * * * /path/to/command

Un comando que se ejecuta cada minuto 5 (ejemplo. 1:05, 2:05, 3:05 etc.):

5 * * * * /path/to/command

Un comando que se ejecuta cada 10 minutos:

Range
0,10,20,30,40,50 * * * * /path/to/command

Un comando que se ejecute cada 6 minutos

Step
*/6 * * * * /path/to/command

Un comando que se ejecuta todos los lunes a las 8:00 AM:

0 8 * * 1 /path/to/command

Un comando que se ejecuta el primer martes de cada mes a las 5:30 p. m.:

30 17 1-7 * 2 /path/to/command

Output

Como se mencionó anteriormente, el  Cron daemon enviará por correo electrónico la salida del comando a la dirección de correo electrónico del usuario o a la dirección establecida por MAILTO cada vez que se ejecute un trabajo cron. Sin embargo, esto puede convertirse en un problema si un comando se ejecuta con frecuencia. Detener los correos electrónicos es una opción que se puede configurar como MAILTO="", pero luego perderá la salida de los comandos. La redirección de Shell se puede usar para que la salida se escriba en un archivo en lugar de enviarse como un correo electrónico.

El siguiente comando escribirá en un archivo de registro cada hora:

0 * * * * echo "Hourly message." > message.log

El comando que se ejecuta es echo "Hourly message.". La parte restante de la línea, > mensaje.log, redirige la salida a un archivo llamado mensaje.log. Es importante tener en cuenta que esto reemplazará lo que esté en message.log con Hourly message. El >> operador agregará al final de un archivo en lugar de sobrescribirlo:

0 * * * * echo "Hourly message." >> message.log


Si este trabajo cron se ejecutó 3 veces, el contenido de message.log se vería así:

Hourly message.
Hourly message.
Hourly message.

Si no le importa la salida normal de un trabajo cron y solo desea que se le notifique cuando encuentre un error, puede redirigir la salida a /dev/null.

0 * * * * /path/to/my/script > /dev/null

/dev/null is a special device file in Linux (and other Unix-like operating systems) that is used when discard output. Anything that is written to this file just gets thrown away by the system.

La redirección también se puede utilizar para evitar que se envíen correos electrónicos mediante el envío de mensajes de salida normales y de error a /dev/null configurado desde MAILTO="".

0 * * * * /path/to/my/script 2>&1 > /dev/null

2>&1 en resumen dice que trate los mensajes de error como una salida normal. Entonces 2>&1 > /dev/null se puede leer como "tratar los mensajes de error como una salida normal y desechar la salida normal".