Apuntes sobre Otras cosas

Cajón Desastre: Todo lo que no encaja en ninguna parte.

cron: programación de tareas en Linux

cron es el planificador de tareas de Linux. Permite ejecutar comandos o scripts de forma automática en momentos concretos: a una hora fija, cada cierto intervalo, una vez a la semana, etc. Es la herramienta estándar para backups automáticos, sincronizaciones periódicas, envío de informes o cualquier tarea que deba repetirse sin intervención humana.

El archivo crontab

Cada usuario tiene su propio crontab (tabla de tareas cron). Para editarlo:

crontab -e    # abrir editor del crontab del usuario actual
crontab -l    # listar las tareas actuales
crontab -r    # eliminar todo el crontab (¡cuidado!)

Nota: la primera vez que ejecutas crontab -e puede pedirte que elijas un editor. nano es la opción más sencilla si no estás familiarizado con vim.

Sintaxis: los cinco campos

Cada línea del crontab sigue este formato:

minuto  hora  día_del_mes  mes  día_de_la_semana  comando
Campo Rango Significado
minuto0–59El minuto exacto de la hora
hora0–23La hora (formato 24h)
día del mes1–31Día del mes
mes1–12Mes del año
día de la semana0–70 y 7 = domingo, 1 = lunes…

El símbolo * significa "cualquier valor" en ese campo.

Ejemplos de programación

# Cada minuto
* * * * * /ruta/al/script.sh

# Cada día a las 2:30 de la madrugada
30 2 * * * /ruta/al/backup.sh

# Cada lunes a las 9:00
0 9 * * 1 /ruta/al/informe.sh

# El primer día de cada mes a las 00:00
0 0 1 * * /ruta/al/facturacion.sh

# Cada 15 minutos
*/15 * * * * /ruta/al/comprobacion.sh

# A las 8:00, 12:00 y 18:00 todos los días
0 8,12,18 * * * /ruta/al/aviso.sh

# De lunes a viernes a las 7:00
0 7 * * 1-5 /ruta/al/laborable.sh

Atajos de tiempo predefinidos

cron acepta también estas palabras clave en lugar de los cinco campos:

@reboot    /ruta/al/script.sh    # al arrancar el sistema
@hourly    /ruta/al/script.sh    # una vez por hora (equivale a: 0 * * * *)
@daily     /ruta/al/script.sh    # una vez al día   (equivale a: 0 0 * * *)
@weekly    /ruta/al/script.sh    # una vez a la semana
@monthly   /ruta/al/script.sh    # una vez al mes

Variables de entorno en crontab

El entorno de cron es mínimo: no tiene el mismo $PATH que tu terminal. Por eso los comandos que funcionen en terminal pueden fallar en cron. Soluciones:

# Opción 1: definir PATH al inicio del crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Opción 2: usar rutas absolutas siempre en los comandos
0 2 * * * /usr/bin/php /var/www/mi_script.php

# Para recibir errores por email (si el servidor tiene MTA):
MAILTO="tu@email.com"

Redirigir el output

Por defecto, cualquier salida que produzca el comando se envía por email al usuario. Es más práctico redirigirla a un log:

# Guardar stdout y stderr en un log
0 2 * * * /ruta/al/backup.sh >> /var/log/backup.log 2>&1

# Descartar toda la salida si no necesitas registros
0 2 * * * /ruta/al/script.sh > /dev/null 2>&1

Cron del sistema

Además del crontab de usuario, el sistema tiene directorios especiales para tareas del sistema. Basta con depositar un script ejecutable en el directorio correspondiente:

/etc/cron.hourly/    # scripts que se ejecutan cada hora
/etc/cron.daily/     # cada día
/etc/cron.weekly/    # cada semana
/etc/cron.monthly/   # cada mes

También puedes crear archivos de crontab individuales en /etc/cron.d/ con la misma sintaxis que el crontab de usuario, pero añadiendo el nombre de usuario como sexto campo:

# Formato en /etc/cron.d/mi-tarea:
30 3 * * * root /ruta/al/script.sh >> /var/log/script.log 2>&1

Buenas prácticas

  • Usa siempre rutas absolutas tanto para el comando como para sus argumentos y archivos.
  • Redirige el output a un log para poder depurar si algo falla.
  • Prueba el script manualmente antes de añadirlo al crontab.
  • Escribe un comentario encima de cada línea explicando qué hace y por qué.
  • Comprueba los logs de cron si algo no funciona: grep cron /var/log/syslog.

En la próxima lección: tmux: multiplexor de terminal para trabajar con varias sesiones y paneles, especialmente útil en conexiones SSH.

TOP