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 ejecutarOperadores 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:
| String | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | Run 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.shCrontab 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.shErrores 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>&1Ejemplos prácticos
*/5 * * * *— run every 5 minutes0 0 * * *— run once a day at midnight0 9 * * 1-5— run at 9 AM on weekdays0 0 1 * *— run at midnight on the 1st of every month0 0 * * 0— run at midnight every Sunday