bitlvl
ES

Chuleta de cron

Orden de los campos, las planificaciones que de verdad se necesitan y las tres trampas que explican la mayoría de las incidencias de «mi trabajo cron no se ejecuta».

Cabe en una página A4 / Letter en vertical; usa «Guardar como PDF» en el diálogo de impresión para conservar una copia.

Sintaxis

┌─ minuto (0–59)
│ ┌─ hora (0–23)
│ │ ┌─ día del mes (1–31)
│ │ │ ┌─ mes (1–12, jan–dec)
│ │ │ │ ┌─ día de la semana (0–7, sun–sat; 0 y 7 = domingo)
* * * * *  comando
*todos los valores
5exactamente 5
1-5rango
*/15cada 15
1,15lista
8-18/2paso dentro de un rango

Cadenas especiales

@rebootuna vez al arrancar
@hourly0 * * * *
@daily / @midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly / @annually0 0 1 1 *

Planificaciones

* * * * *cada minuto
*/5 * * * *cada 5 minutos
*/15 9-17 * * 1-5cada 15 min, horario laboral, días laborables
0 * * * *cada hora, en punto
30 * * * *cada hora a y media
0 */6 * * *cada 6 horas (0, 6, 12, 18)
0 0 * * *cada día a medianoche
0 3 * * *cada día a las 03:00
30 6 * * 1-5días laborables a las 06:30
0 9,17 * * 1-5días laborables a las 09:00 y 17:00
0 0 * * 0domingos a medianoche
0 0 * * 6,0fines de semana
0 0 1 * *primer día del mes
0 0 1,15 * *el 1 y el 15
0 0 1 */3 *trimestral (1 de ene, abr, jul, oct)
0 0 1 1 *anual
0 0 * * 1#1primer lunes (no estándar; usa 0 0 1-7 * 1)
0 0 1-7 * 1primer lunes — cuidado: se dispara los días 1–7 O cualquier lunes; añade la prueba [ $(date +\%u) = 1 ]
0 0 28-31 * * [ $(date -d tomorrow +\%d) = 01 ] && cmdúltimo día del mes
0 2 * * * sleep $((RANDOM \% 1800)); cmd02:00 con hasta 30 min de variación

Trampas

  • PATH es mínimo (/usr/bin:/bin). Usa rutas absolutas o pon PATH=… al principio del crontab.
  • % significa salto de línea en el comando; escribe \% (date +\%F).
  • Sin perfil de shell: no se cargan alias, nvm, rbenv, venvs.
  • La zona horaria es la del demonio (normalmente la del sistema, a menudo UTC en servidores). CRON_TZ=Europe/Madrid funciona en cronie.
  • Día del mes Y día de la semana ambos fijados = se ejecuta cuando coincide cualquiera.
  • La salida se envía por correo al usuario; redirígela o pon MAILTO=.
  • Solapamiento: cron vuelve a lanzar el trabajo aunque el anterior siga en marcha. Envuélvelo en flock -n /tmp/job.lock cmd.

Comandos

crontab -eeditar tu crontab
crontab -llistar
crontab -reliminar todo (¡sin confirmación!)
crontab -u www-data -lel de otro usuario (root)
/etc/crontab, /etc/cron.d/*crontabs del sistema: tienen un campo de usuario tras la planificación
/etc/cron.{hourly,daily,weekly,monthly}/scripts que se dejan ahí, ejecutados por anacron en escritorios
grep CRON /var/log/syslog; journalctl -u cronver qué se ejecutó

Una plantilla segura

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
SHELL=/bin/bash
# m h dom mon dow  comando
30 6 * * 1-5  flock -n /run/backup.lock /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Los resultados y mensajes de esta herramienta se muestran en inglés.

Preguntas

¿Cómo compruebo qué significa una expresión cron?

Pégala en el explicador de cron; imprime la planificación en lenguaje llano y las próximas diez ejecuciones en tu zona horaria.