crontab.run

Explicación del comando crontab

El daemon cron (crond) es un servicio en segundo plano en sistemas operativos Unix que ejecuta comandos programados. Lee la configuración de archivos crontab (tablas cron), que definen cuándo y con qué frecuencia debe ejecutarse cada comando.

Sintaxis

El comando crontab gestiona los archivos crontab de cada usuario:

crontab [-u user] [-l | -r | -e | -i] [file]

Opciones

-e
Edita el crontab del usuario actual en el editor predeterminado ($VISUAL o $EDITOR). El nuevo crontab se instala después de cerrar el editor.
-l
Muestra el crontab del usuario actual en la salida estándar.
-r
Elimina completamente el crontab del usuario actual.
-i
Solicita confirmación antes de eliminar (usado con -r).
-u user
Opera sobre el crontab del usuario especificado en lugar del propio. Requiere privilegios root.
file
Instala el crontab desde el archivo proporcionado. Use - para entrada estándar.

Formato del archivo crontab

Cada línea en un archivo crontab es una asignación de variable de entorno, un comentario (que comienza con #) o un cron job con este formato:

┌───────────── minuto (0–59)
│ ┌───────────── hora (0–23)
│ │ ┌───────────── día del mes (1–31)
│ │ │ ┌───────────── mes (1–12 o JAN–DEC)
│ │ │ │ ┌───────────── día de la semana (0–6 o SUN–SAT)
│ │ │ │ │
* * * * *  comando a ejecutar

Operadores de campo

* (asterisk)
Coincide con todos los valores posibles del campo.
, (comma)
Especifica una lista de valores. Ejemplo: 1,15 en el campo día del mes significa el día 1 y el 15.
- (hyphen)
Define un rango inclusivo. Ejemplo: 9-17 en el campo hora significa cada hora de 9 a 17.
/ (slash)
Define un paso. Ejemplo: */10 en el campo minuto significa cada 10 minutos. Se puede combinar con un rango: 1-30/5.

Cadenas especiales

En lugar de los cinco campos de tiempo, puede usar una de estas cadenas abreviadas:

StringEquivalent
@yearly / @annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily / @midnight0 0 * * *
@hourly0 * * * *
@rebootRun once at startup

Variables de entorno

Puede definir variables de entorno al inicio de un archivo crontab. Las más comunes son:

SHELL
El shell usado para ejecutar comandos (predeterminado: /bin/sh).
PATH
La ruta de búsqueda para comandos. El PATH predeterminado de cron es mínimo (generalmente /usr/bin:/bin), así que siempre use rutas absolutas o defina PATH explícitamente.
MAILTO
Dónde enviar la salida de los comandos. Defina como "" para suprimir el correo. Por defecto, la salida se envía por correo al propietario del crontab.
CRON_TZ
Establece la zona horaria para el crontab (no soportado en todos los sistemas). Sin él, cron usa la zona horaria del sistema.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]

*/5 * * * * /home/user/scripts/backup.sh

Crontab del sistema vs. crontab de usuario

Los crontabs de usuario (editados con crontab -e) tienen cinco campos de tiempo más el comando. El crontab del sistema (/etc/crontab) y los archivos en /etc/cron.d/ tienen un campo adicional entre los campos de tiempo y el comando: el nombre de usuario con el que se ejecuta el comando.

Ejemplo de crontab del sistema:

# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh

Errores comunes

% (percent sign)

El signo de porcentaje (%) tiene un significado especial en crontab: se convierte en un salto de línea, y todo lo que sigue al primer % se envía como entrada estándar al comando. Para usar un % literal, escápelo con \%.

# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"

PATH

Cron se ejecuta con un PATH mínimo. Los scripts que dependen de comandos en /usr/local/bin u otros directorios deben usar rutas absolutas o definir PATH al inicio del crontab.

Day-of-month + day-of-week

Cuando tanto el día del mes como el día de la semana están restringidos (no *), cron ejecuta el comando cuando cualquiera de los campos coincide (lógica OR), no cuando ambos coinciden. Por ejemplo, 0 0 1 * 5 se ejecuta a medianoche el día 1 de cada mes Y cada viernes.

Timezone

Cron usa la zona horaria del sistema por defecto. Si su servidor está en UTC pero quiere ejecutar jobs en una zona horaria local, use CRON_TZ (donde esté soportado) o convierta los horarios manualmente.

Output and logging

Por defecto, cron envía toda la salida (stdout y stderr) al propietario del crontab. Para silenciar un job, redirija la salida: command > /dev/null 2>&1. Para registrar la salida, redirija a un archivo: command >> /var/log/myjob.log 2>&1.

# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

Ejemplos prácticos